簡體   English   中英

C++ 刪除指向指針數組的指針而不刪除內容[內存泄漏]

[英]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在賦值之前指向的數組。

您必須在(唯一)指向它的指針被覆蓋之前刪除該數組。 此外, deletenew[]刪除指針是錯誤的。 delete[]是正確的:

delete[] m_listArray;
m_listArray = sorted;

PS 將裸指針指向擁有的內存並不是一個好主意。 我建議改用std::vector 此外,不必為了排序而分配一個新數組。 您可以簡單地交換數組中的元素。

我認為您只是刪除指向數組中第一個元素的指針。 我相信您需要使用以下命令釋放陣列。 delete[] sorted

閱讀更多關於刪除和刪除[] [刪除與刪除[]] 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM