我正在编写自己的数组排序方法,并且创建了一个重复的数组来存储对象。数组都是指针数组,因此我需要删除我的临时数组而不删除其指向的项。在下面的代码片段中,我正在删除内存,因为我要么删除所有项目,要么什么都不删除。
//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;
}
如何在不泄漏内存的情况下将重复的列表转移回原始列表?
答案 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