我有一個字節數組,如下所示:C++堆損壞DETECTED - CRT
BYTE* m_pImage;
m_pImage = new BYTE[m_someLength];
而在我的節目數據的各個階段將被複制到該陣列像這樣:
BYTE* pDestinationBuffer = m_pImage + m_imageOffset;
memcpy(pDestinationBuffer, (BYTE*)data, dataLength);
但是,當我去刪除我的緩衝區像這樣:
delete[] m_pImage;
我收到 HEAP CORRUPTI檢測到 - CRT檢測到應用程序在堆緩衝區結束後寫入內存
現在我嘗試了一個簡單的程序來嘗試並複製該錯誤,以幫助我調查發生了什麼。我從下面看到,如果我創建了一個大小爲5的數組,但是在它的末尾寫下並嘗試刪除它,我會得到完全相同的錯誤。
int* myArray = new int[5];
myArray[0] = 0;
myArray[1] = 1;
myArray[2] = 2;
myArray[3] = 3;
myArray[4] = 4;
myArray[5] = 5; // writing beyond array bounds
delete[] myArray;
現在我的問題是我怎麼可能調試或找出什麼是覆蓋我原來的緩衝區。我知道某些東西會覆蓋緩衝區的末尾,所以有沒有辦法讓visual studio幫助我輕鬆地進行調試。
上面那個複製到數據緩衝區的代碼在刪除之前會被調用幾次,所以很難保持m_pImage內容和複製到它的數據的跟蹤。 (其大約2M價值的數據)
你可以使用像valgrind這樣的工具來找到錯誤。你也可以檢查'm_imageOffset + dataLength <= m_someLength'。從根本上說,你付出的代價是使用原始數組而不是'std :: vector'。 – 2014-10-08 19:25:05
'm_pImage + m_imageOffset + dataLength'將會是'> m_someLength' – 2014-10-08 19:25:27
在visual studio中有內存斷點,你可以嘗試在緩衝區的最後設置一個 – PeterT 2014-10-08 19:25:34