通过指针获取公共类成员时出现分段错误

Segmentation fault when getting public class member through pointer

本文关键字:分段 错误 成员 指针 获取      更新时间:2023-10-16

我有几个类来处理在游戏中设置玩家所选择的区域。

Region类:

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. Europen"
             << "1. Russian"
             << "2. SEAn"
             << "3. American"
             << "4. Chinan"
             << "5. African";
        do {
            cout << "Select a regionn> ";
            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->name;引起

我以前从来没有遇到过分段错误,我真的不理解GDB输出,这就是我问这个的原因。

GitHub上的完整源代码

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

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

如Igor所说,主playerController中的局部变量不受局部变量regionHandler的影响。我还在学习面向对象,所以纠正我,如果我错了,但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. Europen"
             << "1. Russian"
             << "2. SEAn"
             << "3. American"
             << "4. Chinan"
             << "5. African";
        do {
            cout << "Select a regionn> ";
            cin >> playerRegionIndex; // Get user to input a region int
        }
        while(playerRegionIndex < 0 || playerRegionIndex > 5);
       return &regions[playerRegionIndex];
    }
}