最近我遇到了我的代碼崩潰,我不能肯定它是如何以及爲什麼崩潰和使用靜態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
你用錯了'delete'。下次使用智能指針向量(假設您實際上需要指針)。 – chris