2010-10-22 28 views
4

我有我的課的私人部分定義的枚舉類型。我也有這種類型的成員。當我嘗試在構造函數體中初始化這個成員時,我在運行時遇到內存損壞問題。當我通過相同的構造函數中的初始化列表初始化它時,我沒有得到內存損壞問題。難道我做錯了什麼?成員初始化:GCC中的錯誤還是我的想法?

我會簡化代碼,如果它是一個GCC錯誤,我確信它是我組合/繼承/等的特定類的組合,但我保證這捕獲了問題。在初始化之前,Nothing沒有使用這個成員變量,並且在完全構造完成之前,沒有任何操作使用新創建的對象。這個成員的初始化確實是我在主體中做的第一件事情,當內存損壞發生時,valgrind說它正在我初始化變量的那一行。 Valgrind的說,這是大小的無效寫4.

相關頭代碼:

 

private: 
    enum StateOption{original = 0, blindside};  
    StateOption currentState; 
 

相關的.cpp代碼(會導致內存破壞和崩潰):

 

MyClass::MyClass(AClass* classPtr) : 
    BaseClass(std::string("some_setting"),classPtr) 
{ 
    currentState = original; 
    ... 
} 
 

相關的.cpp代碼(不會導致內存損壞和崩潰):

 

MyClass::MyClass(AClass* classPtr) : 
    BaseClass(std::string("some_setting"),classPtr), 
    currentState(original) 
{ 
    ... 
} 
 

編輯:請參閱我的「答案」是什麼導致了這一點。閱讀完之後,有人可以向我解釋爲什麼它有所作爲嗎?我沒有更改標題中的任何內容,顯然目標文件正在重建,因爲我在打印時出現了打印語句,而且缺少在一個版本下看到的錯誤,而是看不到另一個版本的錯誤。

爲了一個很好的解釋,我將它標記爲這個問題的答案。

+0

當你說「沒有任何東西在它被初始化之前使用這個成員變量」,你確定包括初始化列表中的其他元素,甚至間接嗎?還有別的東西叫做'original'嗎? – 2010-10-22 13:48:30

+0

如果您刪除'private:',它會起作用嗎? – 2010-10-22 13:51:07

+0

@油是的,我是積極的。基類沒有實現類似這個功能的東西,而這個類是繼承層次上的最後一個類(它只有兩類深度)。單詞「original」甚至不出現在基類的.h或.cpp中。儘管如此,感謝您檢查腦死的錯誤。我之前做過類似的工作:) – 2010-10-22 13:53:25

回答

1

爲後人:

看來好像化妝腳本不是皮卡了這些文件的修改出於某種原因。手動刪除對象而不是讓我們的make文件中的「乾淨」目標導致完全重建(這需要一些時間),並且問題消失。

+0

這個原因可能是您修改了Makefile – doc 2010-10-22 14:31:30

+0

添加ccache(http://ccache.samba.org/)將大大縮短重新編譯時間。 – 2010-10-22 23:40:51

+0

最常見的原因是Makefile沒有表示目標文件和頭文件之間的依賴關係,所以更改頭文件無法重新編譯依賴它的所有代碼。 – 2010-10-22 23:54:19

相關問題