删除指针数组而不删除内存中的指向对象?
我想知道是否有办法删除指针数组而不触及内存中的指向对象。删除指针数组而不删除内存中的指向对象?
我正在为几天前实现的HashSet
写一个约束例程,所以当哈希表已满时,它将被另一个双倍大小的表所取代。我使用指向一个对象的指针数组(User
)来表示哈希表,并且该数组本身在我的HashSet
类中动态声明,因此可以在使用哈希函数将其所有内容复制到新表后将其删除。
所以基本上我需要:
- 声明另一个表,其大小等于原始阵列大小的两倍。
- 将每个指向
User
对象的指针从我的原始数组复制到应用我的散列函数的新对象(它从内存中获取User
对象,并使用表示用户名的字符串计算索引)。 - 将原始数组中的所有指针插入新数组后,我必须释放原始数组的分配内存,并将我的HashSet类(成员专用
userContainer
)中的指针替换为新数组的指针(数组)。
问题是,如果我使用delete[] userContainer
为它释放分配的内存,它也将删除内存中的每个对象,以便新创建的替换数组将指向内存中释放的位置!
你所描述的听起来不正确。
比方说,你有一个class A
与您共创的A
s的磁盘阵列:
A** array1 = new A*[32];
然后填充:
for(int i = 0; i < 32; ++i)
array1[i] = new A();
做一个delete[] array1
没有释放的array1
的元素。
因此,这是安全的:
A** array1 = new A*[32];
for(int i = 0; i < 32; ++i)
array1[i] = new A();
A** arary2 = new A*[64];
for(i = 0; i < 32; ++i)
array2[i] = array1[i];
delete [] array1;
for(i = 0; i < 32; ++i)
// do something with array2[i]
奇妙的,我现在可以做到:array1 = array2,所以我的类成员现在指向内存中的有效数组? –
是的,在你调用'delete [] array1'之后,你可以设置'array1 = array2',你就完成了,直到它再次满了! – esskar
一般来说,当你删除一个指针数组时,指针所指向的任何对象都保持存在。实际上,这是潜在的大内存泄漏源。但是在某些引用计数环境(例如Objective-C或Qt)中,当您删除一个数组OBJECT(而不是简单的[]
数组)时,引用计数递减,如果计数为零。
但是,如果你正在重构散列表,你最好在删除数组之前保存指针值,否则所有寻址的对象将会丢失。当你保存它们时,你可以增加它们的引用计数(如果你正确的话)。
(这将有助于了解你正在处理的是什么语言,您可以通过“阵列”的意思。)
抱歉没有提及编程语言。它是C++ –
你知道malloc
/free
之间的差异,new
/delete
和new[]
/delete[]
? 我想你可能不想在你的情况下使用new[]
/delete[]
,因为你不想让析构函数被调用吗?
我想只释放原始数组的分配空间,并且仍然有内存中的对象,因为我已经插入了所需的指针,以使它们位于替换数组中。我不知道malloc/free,new/delete和malloc/free,new []/delete []之间的区别,但我想new/delete和new []/delete []是基于malloc/free的,我可能需要使用malloc/free来达到我的目标。 –
我不认为你的问题的存在。这里有一个婴儿例子表明,没有什么可担心的:
Foo * brr[10];
{
Foo * arr[10];
// This is not touching the objects!
for (Foo * it = arr; it != arr + 10; ++it) *it = new Foo;
std::copy(arr, arr + 10, brr);
} // no more arr
for (Foo * it = brr; it != brr + 10; ++it) delete *it; // fine
您可以*地周围,就像你喜欢复制三分球。请记住删除不再需要指针指向的对象。
或许微不足道的提醒:指针没有析构函数;特别是当指针超出范围时,没有任何反应。
很容易假装'arr'死亡,只是范围。 ;) – Xeo
@Xeo:假装! –
对不起没有提及的编程语言。这是C++ –