2010-10-12 94 views
2

我正在嘗試使用G ++編譯一些C++代碼。它似乎在其他編譯器中工作正常,但由於某種原因,G ++不會產生工作輸出。G ++中的C++ - 不使用指針時出現分段錯誤

泄露:這是家庭作業的一部分,但我覺得它更像是一個編譯器問題,因爲它在其他編譯器中工作。

這裏是一個的肆虐的片段:

set<int> t1, t2; 

這很奇怪,因爲下面的代碼工作得很好:

set<int> *t1 = new set<int>(); 
set<int> *t2 = new set<int>(); 

當然,我必須使用->,而不是.,但是這預期。第一個片段在運行時會產生分段錯誤。第二個直觀地表達了我期望的結果。

總之,幕後,.cppset有這樣的:

#include <cstdlib> 
#include <iostream> 

using namespace std; 

template <class T> 
set<T>::set() : bag<T>() {} 

template <class T> 
set<T>::set(const set<T>& b) : bag<T>(b) {} 

.h看起來是這樣的:

#include "bag.h" 

template <class T> 
class set : public bag<T> 
{ 
    public: 
     set(); 
     set(const set &b); 

// ... 

}; 
#include "set.cpp" 

最後但並非最不重要的,bag.cppbag.h文件看起來像這個:

using namespace std; 

template <class T> 
bag<T>::bag() { 
    head = NULL; 
} 

template <class T> 
bag<T>::bag(const bag<T>& b) { 

    // ... 

} 

bag.h

template <class T> 
class bag 
{ 
    public: 
     bag(); 
     bag(const bag &b); 

    // ... 
}; 
#include "bag.cpp" 

再次,我覺得G ++只是恨我,但後來我又可以做了愚蠢的事情。只需簡單地向正確的方向推動就會很棒。

+5

'使用命名空間標準'結合命名您的類與標準庫名稱('set')相同的事情只能以眼淚結束。 – 2010-10-12 05:02:17

+4

確切地說,'set'和'bag'的析構函數是做什麼的? (當在第一個代碼片段中創建一個對象時,該對象在其封閉的作用域塊的末尾被銷燬,當您像在第二個代碼片段中那樣動態地使用'new'創建一個對象時,該對象被銷燬當你「刪除」它。如果你從不「刪除」它,析構函數將永遠不會被調用;我猜測析構函數中的某些東西可能是你的問題的原因'')。 – 2010-10-12 05:04:23

+0

@James:我將這個類重命名爲'discreet_set'。沒有效果。至於析構函數,它迭代一個鏈表並刪除每個節點的值。沒有什麼奇特的,但我會修補並讓你知道。非常感謝! – mattbasta 2010-10-12 05:19:21

回答

8

以下是一般提示,將使您的生活變得更容易。

編譯這個程序與 「-g」 和 「-Wall」 標誌:

gcc -g -Wall foo.cpp 

的 「-g」,增加了調試信息。編譯時,「-Wall」會吐出額外的警告。然後使用調試器:

gdb ./a.out 

命中運行開始你的計劃。一旦代碼 崩潰,使用bt轉儲您的調用堆棧。然後,您可以確切地看到代碼中發生崩潰的位置。

當你在這裏,谷歌「gdb教程」。花一兩個小時學習如何正確使用gdb將會有利可圖。我答應你。

+2

哇我離開了。而且,**聖潔的廢話**。最好的事情。 'gdb'是我最喜歡的「玩具」。非常感激! – mattbasta 2010-10-12 05:41:53