调用方法c ++时的Segfault

时间:2010-04-07 15:17:32

标签: c++ methods segmentation-fault call

我对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,并且值直接返回。但它仍然是段错误。至于发布实际代码,它是相当大的,我应该发布哪些部分?

5 个答案:

答案 0 :(得分:4)

从我所看到的,您显示的代码没有任何问题。但是,段错误通常表明您的内存已损坏。除了你所展示的内容之外,它还会发生在其他地方,并且恰好会影响到这里的代码。我会查看您处理数组,指针或任何手动内存交互的任何地方。

答案 1 :(得分:4)

我已成功使用valgrind和很多段错误。

并且您是否尝试使用由segfault引起的coredump运行gdb?来自man gdb:

gdb program core

要创建一个coredump,您可能需要设置:

ulimit -c unlimited

答案 2 :(得分:1)

在黑暗中拍摄。 (Game*)thisNULL

答案 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文件,则可能会发生此类崩溃更改标题后。

其他一些可能性是:

  • 堆栈溢出:由于深度递归,你已经在堆栈上分配了大量内存,或者将包含大数据数据的对象分配为局部变量(即未创建或具有new或malloc的堆))
  • 损坏的类vtable(通常仅由于构建工具中的依赖性错误而可能),
  • 损坏的对象vtable指针:可能通过滥用指针:使用指针删除内存,或错误地写入使用中的地址。在您的示例中不太可能,因为没有虚函数。
  • 维护对已删除的堆栈上分配的对象的指针或引用:上面的打印输出代码将揭示这种情况。

答案 4 :(得分:-1)

我想知道,因为您在 Game 类的私有中定义了 some_function()。所以你上面提到的代码结构也会为此抛出错误。