2012-12-07 103 views
2

最近我遇到了我的代碼崩潰,我不能肯定它是如何以及爲什麼崩潰和使用靜態analyizers開始,然後我就開始使用英特爾督察XE 2013年我一直運行到同一「無效的內存訪問」我的代碼,所以我就開始我的代碼降低到儘可能小的形狀讓它重現,在那裏我終於得到了一個點,似乎有一個「無效的內存訪問」我的代碼,但只有當我班有一個析構函數。有趣的是,我的「無效內存訪問」發生在它試圖刪除的地址之前的地址上。最終導致「無效內存訪問」的代碼實際上並沒有崩潰我的代碼,但我認爲我會解決這個潛在問題,因爲它存在雪球效應。我所討論的代碼是我的代碼中是否存在無效的內存訪問?

class Group { 
public: 
    Group() {} 
    ~Group() {} // When this line is not here, there will not be an "Invalid memory access" 
}; 

int main() { 
    Group** groups = new Group*[3]; 

    groups[0] = new Group(); 
    groups[1] = new Group(); 
    groups[2] = new Group(); 

    for(unsigned int i = 0; i < 3; ++i) 
     delete [] groups[i]; 

    delete [] groups; 

    return 0; 
} 

「無效存儲器訪問」的問題將在它試圖在第一時間被標記「刪除[]組[I]」(所以我將等於0)。它所標記的內存地址是「0x003e30ec」,其中組[0]實際上是「0x003e30f0」,它是0x4之前的地址。每當我運行這個測試時,它總是在0x4的差值。

我的問題是,我的代碼實際上是否存在任何錯誤,我正在讀取或寫入內存不當,或者這個人只是英特爾Inspector XE 2013(我在Visual Studio 2012 Update 1上)的糟糕結果?

對於那些好奇我的記憶表,上面的例子,它是以下

groups == 0x003e30b8 
groups[0] == 0x003e30f0 
groups[1] == 0x003e3120 
groups[2] == 0x003e3150 
+1

你用錯了'delete'。下次使用智能指針向量(假設您實際上需要指針)。 – chris

回答

5
for(unsigned int i = 0; i < 3; ++i) 
     delete [] groups[i]; 

應該

for(unsigned int i = 0; i < 3; ++i) 
     delete groups[i]; 

new/deletenew [] /delete []應始終一致。在你的情況下,只需使用std::vector<std::shared_ptr<Group> > groups;將是一個更好的方法。

,我終於到這裏似乎有一個 「無效的內存訪問」我的代碼,但只有當我班有一個 析構函數的一個點。

使用wrong delete[]就是爲什麼你的應用程序崩潰,它無關,與你的析構函數在這種情況下,除非你有什麼藏在你的析構函數,但是這將是另一個bug。

+0

當存在析構函數時,如果使用不正確的delete [],導致無效內存訪問的關係是什麼? – judeclarke

+0

這不是因爲析構函數,這是因爲你'new'一個對象和'delete []'這是UB – billz

1

我相信你的問題是你使用的陣列式delete [],你應該只使用正規的delete。這是因爲groups中的每個元素都是單個的Group對象,而不是它們的數組。

你這樣做,但是,需要使用delete []groups內存。

相關問題