2013-03-08 98 views
0

我有一個std ::向量會引起一些很奇怪的賽格故障向量::明確()導致賽格故障

//A.h 
class A{ 
private: 
    std::vector<float> data; 
public: 
    void set(const std::vector<float>& data); 
}; 
//A.cpp 
void A::set(const vector<float>& data){ 
    this->data.clear(); // crashes on this line 
    for(float f : data) this->data.push_back(f); 
} 

在什麼情況下可能會向量::明確()導致賽格故障?我最初有

void A::set(const vector<float>& data){ 
    this->data = data; 
} 

並且有同樣的問題。我切換到上面進行調試。 這是在海灣合作委員會4.7.2,x86_64

+0

太多的參數稱爲'數據'和數據成員'數據'...你爲什麼給自己造成歧義?我的建議是將成員'data'重命名爲'data_' – LihO 2013-03-08 08:46:25

+0

很可能你有某處存在內存損壞。你錯誤地覆蓋了A對象佔用的內存。 – user1610015 2013-03-08 08:46:30

+0

但我同意,上面的代碼不負責segfault,問題在別的地方。 – LihO 2013-03-08 08:47:45

回答

3

IF它在調用「data.clear」(我的意思是,正是在這條線,不顯山露水裏面清楚)正好死機,那麼可以肯定的斷層線檢查this指針。

如果由於以前錯誤的累積影響,您的$ this爲空或垃圾值,那麼此行可能表現類似。 (幾乎)另一方面,如果它實際上在清除內部的某個地方崩潰,並且您只是削減了堆棧跟蹤以使問題描述更加緩慢,那麼仍然可能導致同樣的原因。

您可以在調試器中輕鬆檢查'this'指針是否爲NULL。此外,檢測垃圾值並不困難:向A類中添加一些測試域,用一些可預測的BUT NOT CONSTANT值將它們填充到構造函數中,當應用程序崩潰時,檢查this-> mytestvalue是否正確。如果$ this被丟棄,那麼指向的測試值通常幾乎是隨機的。

+1

你說得對,原來是在包含它的A已經超出範圍之後,調用vector :: clear()。謝謝 – 2013-03-08 10:50:38

2

可能這是由於堆棧/內存損壞發生在別處。您應該使用內存檢查器運行您的程序,例如Valgrind使用memcheck工具來查看發生了什麼。

+0

很高興我能幫到你。 – 2013-03-08 09:47:49