删除指针数组而不删除内存中的指向对象?
Posted
技术标签:
【中文标题】删除指针数组而不删除内存中的指向对象?【英文标题】:Delete a pointer array without deleting the pointed objects in memory? 【发布时间】:2011-11-27 21:30:32 【问题描述】:我想知道是否有一种方法可以在不触及内存中指向的对象的情况下删除指针数组。
我正在为几天前实现的HashSet
编写一个限制例程,因此当哈希表已满时,它会被另一个双倍大小的表替换。我使用指向对象的指针数组 (User
) 表示哈希表,并且数组本身在我的 HashSet
类中动态声明,因此可以在将其所有内容复制到新表后使用散列函数。
所以基本上我需要:
-
声明另一个表,其大小等于原始数组大小的两倍。
将每个指向
User
对象的指针从我的原始数组复制到应用我的哈希函数的新数组(它从内存中获取User
对象,并使用代表用户名的字符串计算索引)。李>
将原始数组中的所有指针插入新数组后,我必须释放为原始数组分配的内存,并将我的 HashSet 类中的指针(成员私有userContainer
)替换为新数组的位置一个(数组)。
问题是,如果我使用delete[] userContainer
为其释放分配的内存,它也会删除内存中的每个对象,因此新创建的替换数组将指向内存中已释放的位置!
【问题讨论】:
很抱歉没有提到编程语言。它是 C++ 【参考方案1】:你的描述听起来不对。
假设您有一个 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
,你就完成了,直到它再次被填满!【参考方案2】:
一般来说,当你删除一个指针数组时,指针指向的任何对象都会保持存在。事实上,这是大内存泄漏的潜在来源。
但是在某种引用计数环境(例如,Objective-C 或 Qt)中,当您删除一个数组 OBJECT(相对于一个简单的 []
数组)时,引用计数会减少,并且如果出现以下情况,对象将被删除计数归零。
但是,如果您正在重构哈希表,您最好在删除数组之前以某种方式保存指针值,否则所有寻址对象都将丢失。当你保存它们时,你可以增加它们的引用计数(如果你做得对的话)。
(了解您正在处理的语言以及“数组”的含义会有所帮助。)
【讨论】:
很抱歉没有提到编程语言。它是 C++【参考方案3】:我认为您的问题不存在。这是一个小例子,表明没有什么可担心的:
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
死了,只是范围它。 ;)【参考方案4】:
你知道malloc
/free
、new
/delete
和new[]
/delete[]
之间的区别吗?
我想你可能不想在你的情况下使用new[]
/delete[]
,因为我猜你不想调用析构函数?
【讨论】:
我只想释放为原始数组分配的空间,并且在内存中仍然有对象,因为我已经插入了所需的指针以将它们放入替换数组中。而且我不知道 malloc/free、new/delete 和 malloc/free、new[]/delete[] 之间的区别,但我猜 new/delete 和 new[]/delete[] 是基于 malloc/free 和我可能需要使用 malloc/free 来达到我的目标。以上是关于删除指针数组而不删除内存中的指向对象?的主要内容,如果未能解决你的问题,请参考以下文章