通过指针获取公共类成员时出现分段错误
Segmentation fault when getting public class member through pointer
我有几个类来处理在游戏中设置玩家所选择的区域。
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 = ®ions[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 ®ions[playerRegionIndex];
}
}
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?