我有我的課的私人部分定義的枚舉類型。我也有這種類型的成員。當我嘗試在構造函數體中初始化這個成員時,我在運行時遇到內存損壞問題。當我通過相同的構造函數中的初始化列表初始化它時,我沒有得到內存損壞問題。難道我做錯了什麼?成員初始化: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)
{
...
}
編輯:請參閱我的「答案」是什麼導致了這一點。閱讀完之後,有人可以向我解釋爲什麼它有所作爲嗎?我沒有更改標題中的任何內容,顯然目標文件正在重建,因爲我在打印時出現了打印語句,而且缺少在一個版本下看到的錯誤,而是看不到另一個版本的錯誤。
爲了一個很好的解釋,我將它標記爲這個問題的答案。
當你說「沒有任何東西在它被初始化之前使用這個成員變量」,你確定包括初始化列表中的其他元素,甚至間接嗎?還有別的東西叫做'original'嗎? – 2010-10-22 13:48:30
如果您刪除'private:',它會起作用嗎? – 2010-10-22 13:51:07
@油是的,我是積極的。基類沒有實現類似這個功能的東西,而這個類是繼承層次上的最後一個類(它只有兩類深度)。單詞「original」甚至不出現在基類的.h或.cpp中。儘管如此,感謝您檢查腦死的錯誤。我之前做過類似的工作:) – 2010-10-22 13:53:25