[英]Reusing a pointer of double array without memory leak in C++ via “delete” crashes the program
[英]C++ Delete Pointer to array of pointers without deleting the contents [Memory Leak]
我正在編寫自己的數組排序方法,並且創建了一個重復數組來存儲對象。 這些數組都是指針數組,所以我需要刪除我的臨時數組而不刪除它指向的項目。 在下面的代碼片段中,我正在泄漏內存,因為我要么刪除所有項目,要么不刪除任何內容。
//In constructor initialiser list
m_listArray( new PathFindingTile*[maxSize] )
void sort()
{
auto** sorted = new PathFindingTile*[m_size];
sorted[0] = m_listArray[0];
for (int i = 1; i < m_size; i++)
{
sorted[i] = m_listArray[i];
for (int j = i; j - 1 >= 0; j--)
{
if (*m_listArray[j] < *m_listArray[j - 1])
{
PathFindingTile* temp = sorted[j - 1];
sorted[j - 1] = m_listArray[i];
sorted[j] = temp;
}
else
{
sorted[i] = m_listArray[i];
break;
}
}
}
m_listArray = sorted;
//Both 'delete sorted' and 'delete[] sorted' delete the contents of sorted, but I'd only like to delete the array pointer
delete sorted;
}
如何在不泄漏內存的情況下將重復的列表傳輸回原始列表?
m_listArray = sorted;
在這一行,你泄漏了m_listArray
在賦值之前指向的數組。
您必須在(唯一)指向它的指針被覆蓋之前刪除該數組。 此外, delete
從new[]
刪除指針是錯誤的。 delete[]
是正確的:
delete[] m_listArray;
m_listArray = sorted;
PS 將裸指針指向擁有的內存並不是一個好主意。 我建議改用std::vector
。 此外,不必為了排序而分配一個新數組。 您可以簡單地交換數組中的元素。
我認為您只是刪除指向數組中第一個元素的指針。 我相信您需要使用以下命令釋放陣列。 delete[] sorted
閱讀更多關於刪除和刪除[] [刪除與刪除[]] 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.