2015-10-19 74 views
-2

我的代碼崩潰與段錯誤,我真的不知道錯誤的位置。當我們將它們作爲參數傳遞時,我仍然在學習指針的方法。這是應該對此重要的代碼。當我運行issueBook()函數時發生段錯誤。Segfault與Qt C++

IssuedBooks.h

#ifndef ISSUEDBOOKS_H 
#define ISSUEDBOOKS_H 

#include "ClientList.h" 
#include "BookList.h" 
#include <QMultiMap> 

class IssuedBooks { 
public: 
    IssuedBooks() {} 
    ~IssuedBooks(); 

    void issueBook(Client*, Book*); 
    void returnBook(Client*, Book*); 

    ClientList getClients() const; 
    BookList getClientBooks(Client*) const; 

private: 
    QMultiMap<Client*, Book*> issuedBooks; 
}; 

#endif 

IssuedBooks.cpp

#include "IssuedBooks.h" 
#include <qDebug> 

IssuedBooks::~IssuedBooks(){ 
    qDeleteAll(issuedBooks); 
    issuedBooks.clear(); 
} 

void IssuedBooks::issueBook(Client* c, Book* b){ 
    if(!issuedBooks.contains(c, b)){ 
     issuedBooks.insert(c, b); 
    } 
} 

void IssuedBooks::returnBook(Client* c, Book* b){ 
    if(issuedBooks.contains(c, b)){ 
     issuedBooks.remove(c, b); 
    } 
} 

ClientList IssuedBooks::getClients() const{ 
    QMapIterator<Client*, Book*> itr(issuedBooks); 
    ClientList clients; 

    while(itr.hasNext()){ 
     itr.next(); 
     clients.addClient(itr.key()); 
    } 

    return clients; 
} 

BookList IssuedBooks::getClientBooks(Client* c) const{ 
    QMapIterator<Client*, Book*> itr(issuedBooks); 
    BookList books; 

    while(itr.hasNext()){ 
     itr.next(); 
     if(itr.key() == c){ 
      books.addBook(itr.value()); 
     } 
    } 

    return books; 
} 

LibraryDriver.cpp

#include "ClientList.h" 
#include "BookList.h" 
#include "IssuedBooks.h" 

#include <QtGui> 
#include <QtWidgets> 

QTextStream cout(stdout); 

int main(int argc, char* argv[]){ 
    QApplication app(argc, argv); 

    BookList bookList; 
    ClientList clientList; 
    IssuedBooks issueList; 

    Book* b = new Book("Nick Corin", "An awesome life.", 59.99); 
    bookList.addBook(b); 

    Client* c = new Client("Nick Corin", QDate::currentDate()); 
    clientList.addClient(c); 

    issueList.issueBook(c, b); 
} 
+1

你有沒有試過GDB找出它爲什麼崩潰? – fceller

+0

你的'問題書'看起來不錯,所以錯誤是在別的地方。 – SingerOfTheFall

+0

有人評論問app.exec(),但現在我找不到評論?事實上,事實證明是由於某種原因? 我添加app.exe()到我的主要功能的結尾,我所有的問題都消失了?任何想法爲什麼? – nickcorin

回答

2

這種問題會在你的編程生活中經常遇到的,所以這裏的一個一般解決方案:

  1. 您應該嘗試找出段錯誤發生的位置。我假設你使用GCC/GNU開發工具鏈。所以你要做的第一件事就是用-g標誌編譯你的代碼,其中包括二進制文件中的調試符號。如果您使用的是IDE,那麼當您選擇「Debug」作爲構建類型時就會發生這種情況。如果您自己撥打g++,請將-g添加到g++選項。
  2. 在gdb中加載程序,GNU DeBugger:gdb --args yourprogram yourprogramarguments
  3. 運行它:(gdb) run<enter>
  4. 等待段錯誤。
  5. 使用backtrace命令找出段錯誤發生的位置。

還有很多其他有用的gdb命令,可以讓你print變量或修改它們。通常,您想添加breakpoint s; help <commandname>將打印一些幫助。

我寫了一個小更全面的指導,GNU收音機開發商量身定做的,但在這裏也適用:Using GDB to debug

+0

感謝你們,我總是手動調試我的代碼,而不是使用調試器。我會試一試。 – nickcorin

0

初學者最常見的錯誤就是嘗試使用尚未被創建和初始化的對象。由於變量中的內存指針指向隨機地址或null,因此會創建內存訪問錯誤(segfault)。

「在計算中,分段故障(常縮寫爲段錯誤)或訪問衝突是通過硬件具有存儲器保護提出了一個故障,關於存儲器訪問衝突通知的操作系統(OS)」

的issueBook( )函數包含一個強有力的候選作爲未初始化的變量。