我对c ++很新,我对此问题感到有些困惑。我试图将一个变量从调用分配给另一个类中的方法,但它总是段错误。我的代码编译没有警告,我已经检查了gdb中的所有变量都是正确的,但函数调用本身似乎导致了段错误。我使用的代码大致如下:
class History{
public:
bool test_history();
};
bool History::test_history(){
std::cout<<"test"; //this line never gets executed
//more code goes in here
return true;
}
class Game{
private:
bool some_function();
public:
History game_actions_history;
};
bool Game::some_function(){
return game_actions_history.test_history();
}
非常感谢任何提示或建议!
编辑:我编辑了代码,因此没有更多的local_variable,并且值直接返回。但它仍然是段错误。至于发布实际代码,它是相当大的,我应该发布哪些部分?
答案 0 :(得分:4)
从我所看到的,您显示的代码没有任何问题。但是,段错误通常表明您的内存已损坏。除了你所展示的内容之外,它还会发生在其他地方,并且恰好会影响到这里的代码。我会查看您处理数组,指针或任何手动内存交互的任何地方。
答案 1 :(得分:4)
我已成功使用valgrind和很多段错误。
并且您是否尝试使用由segfault引起的coredump运行gdb?来自man gdb:
gdb program core
要创建一个coredump,您可能需要设置:
ulimit -c unlimited
答案 2 :(得分:1)
在黑暗中拍摄。 (Game*)this
是NULL
?
答案 3 :(得分:1)
代码很好但是这个例子太不完整,不能说出错了。我建议的一些事情:
为每个类的析构函数和构造函数添加打印输出:
Game::Game() { cerr << this << " Game::Game" << endl; }
Game::Game(Game const&) { cerr << this << " Game::Game(Game const&)" << endl; }
Game::~Game() { cerr << this << " Game::~Game" << endl; }
bool Game::some_function() { cerr << this << " Game::some_function()" << endl; ... }
这将揭示:
其次,对于调试,我强烈建议将打印输出发送到cerr而不是cout。 cout通常在输出之前被缓冲(为了效率),cerr不是(至少,这曾经是这种情况)。如果你的程序在没有执行错误处理程序,at_exit等等的情况下退出,如果输出没有缓冲并立即打印,你就更有可能看到输出。
第三,如果您的类声明存在于标题中,类定义存在于一个cpp文件中,而另一个cpp文件中使用该类的代码,如果未重新编译任何一个cpp文件,则可能会发生此类崩溃更改标题后。
其他一些可能性是:
答案 4 :(得分:-1)
我想知道,因为您在 Game 类的私有中定义了 some_function()。所以你上面提到的代码结构也会为此抛出错误。