2012-11-30 30 views
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,我不明白反對票。有人也可以請解釋,以防萬一這個問題的人,我認爲這是正確的,根據計算器規則。

+3

請寄出'A'的代碼(構造函數,賦值運算符)。 – ecatmur

+0

你可以通過一個簡單的main()來重現行爲嗎,你只需要分配和刪除一張地圖? –

+0

您可以檢查一下,這不是MyClass問題嗎? MyClass的析構函數是空的,但是MyClass成員的析構函數是這樣嗎?要測試之前嘗試清理myMap,然後將其刪除。附:是否有任何需要分配std :: map堆? –

回答

2

該問題是三違反規則。你的對象的任何副本都將導致一個雙免費的。