我想知道是否有办法删除指针数组而不触及内存中的指向对象。
我正在为几天前实现的HashSet
编写一个限制例程,所以当哈希表已满时,它会被另一个双倍大小的表替换。我使用指向对象(User
)的指针数组来表示哈希表,并且数组本身在我的HashSet
类中动态声明,因此可以在将其所有内容复制到使用哈希函数的新表。
所以基本上我需要:
User
对象的指针从原始数组复制到应用我的哈希函数的新对象(它从内存中获取User
对象,并使用表示用户名的字符串计算索引)。userContainer
)中的指针替换为新的(数组)。问题在于,如果我使用delete[] userContainer
释放分配的内存,它也会删除内存中的每个对象,这样新创建的替换数组将指向内存中的释放位置!
答案 0 :(得分:4)
你所描述的听起来不对。
假设您有一个class A
,并使用以下代码创建A
数组:
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]
答案 1 :(得分:2)
通常,当您删除指针数组时,指针指向的任何对象仍然存在。事实上,这是大量内存泄漏的潜在根源。
但是在某种引用计数环境(例如,Objective-C或Qt)中,当您删除数组OBJECT(与简单的[]
数组相比)时,引用计数会递减,对象将是如果计数变为零,则删除。
但是如果你要重构一个哈希表,你最好在删除数组之前以某种方式保存指针值,否则所有被寻址的对象都将丢失。当你保存它们时,你可以增加它们的引用计数(如果你正确的话)。
(了解您正在处理的语言以及“数组”的含义会有所帮助。)
答案 2 :(得分:2)
我不认为你的问题存在。这是一个婴儿的例子,表明没有什么可担心的:
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
您可以随意自由复制指针。只需记住在不再需要时删除指针指向的对象。
一个可能微不足道的提醒:指针没有析构函数;特别是,当指针超出范围时,没有任何反应。
答案 3 :(得分:1)
您知道malloc
/ free
,new
/ delete
和new[]
/ delete[]
之间的区别吗?
我想你可能不希望在你的情况下使用new[]
/ delete[]
,因为你不想让析构函数被调用吗?