C ++删除指向指针数组的指针,而不删除其内容[内存泄漏]

时间:2018-10-26 19:16:30

标签: c++ arrays pointers memory-leaks

我正在编写自己的数组排序方法,并且创建了一个重复的数组来存储对象。数组都是指针数组,因此我需要删除我的临时数组而不删除其指向的项。在下面的代码片段中,我正在删除内存,因为我要么删除所有项目,要么什么都不删除。

//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;
}

如何在不泄漏内存的情况下将重复的列表转移回原始列表?

2 个答案:

答案 0 :(得分:4)

 m_listArray = sorted;

在这一行上,您泄漏了m_listArray指向分配前的数组。

您必须先删除数组(唯一的指针),然后再覆盖它。同样,delete对于从new[]删除指针是错误的。 delete[]是正确的:

delete[] m_listArray;
m_listArray = sorted;

P.S。仅有裸指针指向拥有的内存不是一个好主意。我建议改为使用std::vector。同样,也不必为了排序而分配新数组。您可以简单地在数组中交换元素。

答案 1 :(得分:0)

我认为您只需删除指向数组中第一个元素的指针即可。我相信您需要使用follow命令释放数组。 delete[] sorted

详细了解删除和删除[] [删除与删除[]] 1