【问题标题】:Segmentation fault when getting public class member through pointer通过指针获取公共类成员时出现分段错误
【发布时间】:2016-09-11 17:45:34
【问题描述】:

我有一些类可以处理在游戏中设置玩家选择的区域。

区域类:

class Region 
{
public:
    string name;

    Region(string n) : name(n) {}
}

播放器控制器类:

class PlayerController
{
public 
    Region* playerRegion
}

RegionHandler 类:

class RegionHandler 
{
public:

    enum RegionCode { EU, RU, SEA, AM, CH, AF};

    PlayerController playerController;

    vector<Region> regions;

    RegionHandler() {
        static const char *names[] = { "russia", "sea", "america", "china", "africa"};
        for (auto n : names)
            regions.emplace_back(n);
    }


    void chooseRegion() {

        int playerRegionIndex;

        cout << "Regions:\n"
             << "0. Europe\n"
             << "1. Russia\n"
             << "2. SEA\n"
             << "3. America\n"
             << "4. China\n"
             << "5. Africa\n";

        do {
            cout << "Select a region\n> ";
            cin >> playerRegionIndex; // Get user to input a region int
        }

        while(playerRegionIndex < 0 || playerRegionIndex > 5);

        playerController.playerRegion = &regions[playerRegionIndex];
    }
}

主要:

int main() 
{
    RegionHandler regionHandler;
    PlayerController playerController;

    regionHandler.chooseRegion();

    string mystr = playerController.playerRegion->name;

}

但是,当我尝试将玩家选择的区域名称放入字符串或 cout 中时,我应该能够做到这一点,即使名称是应该在 RegionHandler 中设置的公共字符串,我也会遇到分段错误.我没有收到其他错误,否则程序可以正常工作。

我为playerRegionIndex输入数字后出现分段错误,是由string mystr = playerController.playerRegion-&gt;name;引起的

我以前从未遇到过分段错误,而且我并不真正了解 GDB 输出,这就是我问这个的原因。

GitHub 上的完整源代码

使用 g++ main.cpp -std=c++1y -o main -g 在新的 Ubuntu Bash for Windows 上编译

GDB 输出:

Program received signal SIGSEGV, Segmentation fault.
0x00007f6f237ab45b in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6

【问题讨论】:

  • 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行逐行检查您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
  • regionHandler.chooseRegion() 设置regionHandler.playerControllermain 中的局部变量,也称为playerController,不受影响,其playerRegion 成员保持未初始化,包含垃圾。另请注意,您有 6 个 RegionCodes,但 regions 向量中只有 5 个元素。
  • @πάνταῥεῖ 我不确定您是否已阅读我的问题。我提供了可编译的程序的完整源代码,以及所有可以组合成 main.cpp 并编译为可以正常工作的相关代码行。我已经给出了gdb输出并解释说我不太了解它。我的代码尽可能简洁,而且我不只是放弃它,要求人们为我调试它。我不明白是什么导致了这个问题,这就是我问这个问题的原因。
  • @PaulRoub 我可以看到这两个问题之间的唯一相似之处是两者都会产生分段错误。正如 JJTO 和 Igor 都指出的那样,这里的问题是由两个类之间的不良依赖关系引起的。您作为可能重复链接的问题的任何答案都无法帮助回答这个问题。

标签: c++ pointers segmentation-fault c++14


【解决方案1】:

就像 Igor 所说,main playerController 中的局部变量不受局部变量 regionHandler 的影响。我还在学习 OOP,所以如果我错了,请纠正我,但 playerController 的区域是由 regionHandler.chooseRegion() 方法设置的。这是两个类之间的依赖关系。

class PlayerController
{

private:

public 
    Region* playerRegion;
    PlayerController()
    {...
      RegionHandler handle;
      string region = handle.getRegion(); //using RegionHandler class's method
      playerRegion = new Region(region); 
      ...
    }

}

class RegionHandler 
{
public:

    enum RegionCode { EU, RU, SEA, AM, CH, AF};

    PlayerController playerController;

    vector<Region> regions;

    RegionHandler() {
        static const char *names[] = { "russia", "sea", "america", "china", "africa"};
        for (auto n : names)
            regions.emplace_back(n);
    }


    string chooseRegion() { //change the return type to string

        int playerRegionIndex;

        cout << "Regions:\n"
             << "0. Europe\n"
             << "1. Russia\n"
             << "2. SEA\n"
             << "3. America\n"
             << "4. China\n"
             << "5. Africa\n";

        do {
            cout << "Select a region\n> ";
            cin >> playerRegionIndex; // Get user to input a region int
        }

        while(playerRegionIndex < 0 || playerRegionIndex > 5);

       return &regions[playerRegionIndex];
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-06
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多