删除指针数组而不删除内存中的指向对象?

时间:2011-11-27 21:30:32

标签: c++ arrays memory-management

我想知道是否有办法删除指针数组而不触及内存中的指向对象。

我正在为几天前实现的HashSet编写一个限制例程,所以当哈希表已满时,它会被另一个双倍大小的表替换。我使用指向对象(User)的指针数组来表示哈希表,并且数组本身在我的HashSet类中动态声明,因此可以在将其所有内容复制到使用哈希函数的新表。

所以基本上我需要:

  1. 声明另一个表,其大小等于原始数组大小的两倍。
  2. 将每个指向User对象的指针从原始数组复制到应用我的哈希函数的新对象(它从内存中获取User对象,并使用表示用户名的字符串计算索引)。
  3. 在从原始数组插入所有指针到新数组后,我将不得不为原始数组释放已分配的内存,并将我的HashSet类(成员私有userContainer)中的指针替换为新的(数组)。
  4. 问题在于,如果我使用delete[] userContainer释放分配的内存,它也会删除内存中的每个对象,这样新创建的替换数组将指向内存中的释放位置!

4 个答案:

答案 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 / freenew / deletenew[] / delete[]之间的区别吗? 我想你可能不希望在你的情况下使用new[] / delete[],因为你不想让析构函数被调用吗?