2011-11-27 102 views
1

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

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

所以基本上我需要:

  1. 声明另一个表,其大小等于原始阵列大小的两倍。
  2. 将每个指向User对象的指针从我的原始数组复制到应用我的散列函数的新对象(它从内存中获取User对象,并使用表示用户名的字符串计算索引)。
  3. 将原始数组中的所有指针插入新数组后,我必须释放原始数组的分配内存,并将我的HashSet类(成员专用userContainer)中的指针替换为新数组的指针(数组)。

问题是,如果我使用delete[] userContainer为它释放分配的内存,它也将删除内存中的每个对象,以便新创建的替换数组将指向内存中释放的位置!

+0

对不起没有提及的编程语言。这是C++ –

回答

4

你所描述的听起来不正确。
比方说,你有一个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] 
+0

奇妙的,我现在可以做到:array1 = array2,所以我的类成员现在指向内存中的有效数组? –

+1

是的,在你调用'delete [] array1'之后,你可以设置'array1 = array2',你就完成了,直到它再次满了! – esskar

2

一般来说,当你删除一个指针数组时,指针所指向的任何对象都保持存在。实际上,这是潜在的大内存泄漏源。但是在某些引用计数环境(例如Objective-C或Qt)中,当您删除一个数组OBJECT(而不是简单的[]数组)时,引用计数递减,如果计数为零。

但是,如果你正在重构散列表,你最好在删除数组之前保存指针值,否则所有寻址的对象将会丢失。当你保存它们时,你可以增加它们的引用计数(如果你正确的话)。

(这将有助于了解你正在处理的是什么语言,您可以通过“阵列”的意思。)

+0

抱歉没有提及编程语言。它是C++ –

1

你知道malloc/free之间的差异,new/deletenew[]/delete[]? 我想你可能不想在你的情况下使用new[]/delete[],因为你不想让析构函数被调用吗?

+0

我想只释放原始数组的分配空间,并且仍然有内存中的对象,因为我已经插入了所需的指针,以使它们位于替换数组中。我不知道malloc/free,new/delete和malloc/free,new []/delete []之间的区别,但我想new/delete和new []/delete []是基于malloc/free的,我可能需要使用malloc/free来达到我的目标。 –

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 

您可以自由地周围,就像你喜欢复制三分球。请记住删除不再需要指针指向的对象

或许微不足道的提醒:指针没有析构函数;特别是当指针超出范围时,没有任何反应

+0

很容易假装'arr'死亡,只是范围。 ;) – Xeo

+0

@Xeo:假装! –