簡體   English   中英

調用方法c ++時出現段錯誤

[英]Segfault when calling a method c++

我對 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 並且該值直接返回。 但它仍然是段錯誤。 至於貼出實際代碼,比較大,應該貼哪些部分?

據我所知,您顯示的代碼沒有任何問題。 但是,段錯誤通常很好地表明您的內存已損壞。 除了您顯示的內容之外,它還會在其他地方發生,並且只會影響此處的代碼。 我會查看您處理數組、指針或任何手動內存交互的任何地方。

我已經成功地使用了valgrind並出現了很多段錯誤。

您是否嘗試使用由段錯誤引起的核心轉儲運行 gdb? 來自 man gdb:

gdb program core

要創建核心轉儲,您可能必須設置:

ulimit -c unlimited

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

代碼很好,但示例太不完整,無法說明哪里出了問題。 我建議的一些事情:

將打印輸出添加到每個類的析構函數和構造函數:

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 文件,您可能會遇到這種崩潰標題。

其他一些可能性是:

  • 堆棧溢出:由於深度遞歸,您在堆棧上分配了大量內存,或者將包含大量數據的對象分配為局部變量(即未創建或使用 new 或 malloc 的堆))
  • 損壞的類 vtable(通常只有由於構建工具中的依賴錯誤才有可能),
  • 損壞的對象 vtable 指針:可能通過濫用指針:使用指向已刪除內存的指針,或錯誤地寫入正在使用的地址。 在您的示例中不太可能,因為沒有虛函數。
  • 維護指向已刪除堆棧上分配的對象的指針或引用:上面的打印輸出代碼將揭示這種情況。

我想知道是因為您在 Game 類的私有中定義了 some_function() 。 所以你上面提到的代碼結構也會為此拋出錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM