2013-03-16 97 views
1

當我的程序出現分段錯誤時,我一直在嘗試做一些調試。我已經將它追蹤到倒片被稱爲的位置。倒帶導致分段錯誤

當ISBNPrefix對象被創建

ISBNPrefix::ISBNPrefix(const char* filename) 
{ 

    file = fopen(filename, "r"); 

} 

文件中的文件被打開是ISBNPrefix類的成員:

class ISBNPrefix { 
FILE* file; 
public: 
    ISBNPrefix(const char* filename); 
    bool isRegistered(int area) const; 
    int minNoDigits(int area) const; 
    bool isRegistered(int area, const char* publisher) const; 
    ~ISBNPrefix(); 
}; 

創建該ISBNPrefix對象的行是:

ISBNPrefix prefixList("prefixRanges.txt"); 

prefixRanges.txt是我目錄中文件的名稱

現在我有段錯誤,在本節存在的:

//------------------------------- 
cout << "MADE IT 1" << endl; 
//------------------------------- 
    rewind(file); 
//------------------------------- 
cout << "MADE IT 2" << endl; 
//------------------------------- 

,輸出:

MADE IT 1 
Segmentation fault 

的解構:

ISBNPrefix::~ISBNPrefix() 
{ 
    if(file != NULL) 
    { 
     fclose(file); 
    } 
} 

是文件是唯一的地方已關閉

編輯:經過一些故障排除後,找不到解決方案,並建議我發佈一切。由於我的聲望很低,我不能發佈超過2個鏈接,因此pastebin鏈接位於評論部分。

+0

無效檢查後添加'<< endl' ...有可能緩衝區沒有被刷新。 – Tushar 2013-03-16 20:09:59

+2

我在'ISBNPrefix'類中看不到複製構造函數或賦值運算符,但我看到了析構函數。這將是我對這個問題的第一個猜測。特別是如果你的析構函數關閉了文件,那麼你有一個問題,這可能解釋你所看到的段錯誤。 – john 2013-03-16 20:11:32

+0

請分享更多的「應用程序」代碼,即實例化您的ISBN的代碼。對象 – 2013-03-16 20:12:52

回答

3

我沒有看到您看到的問題,但我確實看到嚴重的問題。在我的系統上它會導致你的程序在退出時崩潰。也許在你的系統上這是你的問題的原因。

此代碼在ISBN頭

class ISBN{ 
     char area[5]; 
     char publisher[7]; 
     char title[6]; 
     bool registered; 
     char ISBNstr[11]; 
     bool isRegistered(const ISBNPrefix& list); 

和驗證碼的ISBN構造

ISBN::ISBN() 
{ 
    for(int i=0;i<=5;i++) 
    { 
    area[i] = '\0'; 
    } 

    for(int i=0;i<=7;i++) 
    { 
    publisher[i] = '\0'; 
    } 

    for(int i=0;i<=6;i++) 
    { 
    title[i] = '\0'; 
    } 

    for(int i=0;i<=11;i++) 
    { 
    ISBNstr[i] = '\0'; 
    } 
    registered = false; 
} 

這些循環都去圓一個太多次。例如。它應該是i<5i<=5在該地區的循環

for(int i=0;i<5;i++) 
    { 
    area[i] = '\0'; 
    } 

因爲這個錯誤你破壞內存,並易引起您所看到的問題。

+0

好吧,我認爲修好了,我還有其他問題,但至少不會給segfaults,非常感謝! – Sizdian 2013-03-16 22:51:44

4
if(file != NULL) 
cout << "ITS NOT NULL"; 
    rewind(file); 

應該已經

if(file != NULL) 
{ 
    cout << "ITS NOT NULL"; 
    rewind(file); 
} 

在第一個版本,只可能輸出聲明是有條件的,不管你多麼縮進下面的行...

我想這是一個即使對於單個語句塊也總是包括括號({}),以避免這樣的簡單事情。另外,請正確格式化您的代碼,並確保縮進符合實際的代碼結構。例如:

if(file != NULL) 
    cout << "ITS NOT NULL"; 
rewind(file); // it would have been more obvious this way 
+0

這沒有幫助,輸出仍然給分段錯誤 – Sizdian 2013-03-16 20:22:58

+0

嗯我不認爲這可以解決他的問題,因爲'ITS NOT NULL'被打印 – 2013-03-16 20:23:10

+1

我認爲你在錯誤的軌道上。該代碼僅用於調試。期望是該文件不會是NULL。我的猜測是該文件已關閉,但OP沒有意識到。 – john 2013-03-16 20:23:30