4
我有一個宣佈:Valgrind的賦予「大小8無效的寫」在閒置的析構函數
std::map<unsigned int, MyClass> *myMap;
成某一類A.此圖是在構造函數創建:
myMap = new std::map<unsigned int, MyClass>;
類MyClass基本上是一個用一些getter/setter存儲一些數據的結構。沒有任何指向MyClass的指針或新實例,只有一對枚舉值,一個unsigned int和一個bool。所以MyClass析構函數是空的。
在另一方面,爲A的析構函數即時刪除地圖:
A::~A(){
if(myMap!=NULL){
delete myMap;
myMap = NULL;
}
}
這裏Valgrind的是告訴我「地址0x4c389b0是大小48 free'd [PID塊內部16個字節: 6077]「在刪除線上。
此外,在析構函數MyClass的,甚至是空的,我越來越「大小8無效的寫[PID:6077]」
我不明白,是這個問題。我一直認爲調用vector或map上的delete會自動調用每個元素對應的析構函數,在這種情況下,析構函數無關。
任何幫助?
編輯:增加了一個構造函數:
A::A(unsigned int someValue){
m_someValue = someValue;
initializeMap();
}
void A::initializeMap(){
myMap = new std::map<unsigned int, MyClass>;
for(unsigned int i=1; i<=20; i++)
mymap->insert(std::make_pair(i,
MyClass(i)));
}
此外,MyClass的構造函數:
SvAvailabitlity::SvAvailabitlity(unsigned int index){
m_index = index; //unsigned int
m_Flag = false; //bool
m_enumData1 = NOT_OK; //enum MyEnum
m_enumData2 = NOT_OK; //enum MyEnum
}
凡MyEnum被定義爲:
typedef enum {
OK = 0,
NOT_OK = 1,
} MyEnum;
BTW,我不明白反對票。有人也可以請解釋,以防萬一這個問題的人,我認爲這是正確的,根據計算器規則。
請寄出'A'的代碼(構造函數,賦值運算符)。 – ecatmur
你可以通過一個簡單的main()來重現行爲嗎,你只需要分配和刪除一張地圖? –
您可以檢查一下,這不是MyClass問題嗎? MyClass的析構函數是空的,但是MyClass成員的析構函數是這樣嗎?要測試之前嘗試清理myMap,然後將其刪除。附:是否有任何需要分配std :: map堆? –