2008-09-07 178 views
18

所以我有一个指针数组指针。如果我这样删除它:C++删除一个指针指针

delete [] PointerToPointers; 

是否会删除所有指向指针?如果没有,我是否必须遍历所有的指针并删除它们,还是有更简单的方法来做到这一点?我的谷歌福似乎没有给我任何这个问题的好答案。

(和是的,我知道我需要使用的载体,这是其中的一个在学校类型分配“关于C++赶上”。)

回答

26

是的,你必须遍历指针,单独删除。

原因:如果其他代码指向了数组中的对象,该怎么办? C++编译器不知道这是否正确,所以你必须明确。

对于“更简单的方法”,有两点建议:(1)为此目的设置一个子例程,以便至少不必多次编写代码。 (2)使用“智能指针”设计范例,在其中用引用计数器保存一个对象数组,然后当对象不再被任何代码引用时删除对象。

1

我想你会比我有循环'我害怕。

3

指针几乎只是内存引用,并没有漂亮的小自清洁.net对象。为每个类创建适当的析构函数将使删除比整个代码中的大量循环更清洁。

16

我同意Jason Cohen的观点,虽然我们可以更清楚一些需要删除循环指针的原因。对于每个“新”或动态内存分配,都需要“删除”内存解除分配。有时候可以隐藏“删除”,就像智能​​指点器一样,但它仍然存在。

int main() 
{ 
    int *pI = new int; 
    int *pArr = new int[10]; 

到目前为止在代码中我们已经分配了两块动态内存。第一个是一个整数,第二个是整数。

delete pI; 
    delete [] pArr; 

这些DELETE语句清除由“新的” S

int ppArr = new int *[10]; 

    for(int indx = 0; indx < 10; ++indx) 
    { 
    ppArr[indx] = new int; 
    } 

这段代码是做两个以前的分配分配的内存。首先,我们为动态数组中的int创建空间。然后,我们需要遍历并为数组中的每个点分配一个int。

for(int indx = 0; indx < 10; ++indx) 
    { 
    delete ppArr[indx]; 
    } 
    delete [] ppArr; 

请注意我分配此内存的顺序,然后我以相反的顺序取消分配它。这是因为如果我们要删除[] ppArr;首先我们会失去告诉我们其他指针是什么的数组。该块或内存将返回给系统,因此无法再可靠地读取。

int a=0; 
    int b=1; 
    int c=2; 

    ppArr = new int *[3]; 

    ppArr[0] = &a; 
    ppArr[1] = &b; 
    ppArr[2] = &c; 

这个我觉得应该提到。仅仅因为你使用指针并不意味着这些指针指向的内存是动态分配的。这就是说,仅仅因为你有一个指针并不意味着它一定需要被删除。我在这里创建的数组是动态分配的,但指针指向int的本地实例当我们删除它时,我们只需要删除数组。

delete [] ppArr; 

    return 0; 

} 

到底动态分配的内存可能会非常棘手,反正你可以用它安全地像一个智能指针或使用STL容器而不是你自己可以让你的生活更加舒适。

4

请参阅boost pointer container,该容器为您自动删除包含的指针,同时保持非常接近普通STL容器的语法。

+0

不错,我不知道那些! – Frank 2010-09-29 14:14:24

0

我不知道为什么这个回答太困难了。

如果您删除了指针数组,您将免费使用 用于通常整数数组的内存。
指向对象的指针是包含地址的整数。

您删除了一堆地址,但没有对象。

delete不关心内存空间的内容,它调用析构函数并将mem标记为空闲。

它并不在意它只是删除了一堆对象的地址 ,它只是看到整数。

这就是为什么你必须先循环阵列!并在每个元素上调用delete ,然后您可以删除数组本身的存储。

好了,现在我的答案了有点长......奇怪...;)

编辑: 贾森的回答并没有错,它只是没有击中当场。 编译器和c(++)中的其他任何东西都不关心你删除其他地方指向的其他地方的东西。你可以做到这一点。尝试使用已删除对象 的其他程序部件会在您身上发生故障。但没有人会阻止你。 当其他地方引用对象 时,也不会销毁指向对象的指针数组。

+0

“尝试使用已删除对象的其他程序部件会对您进行段错误”。......段间隔可能是最好的结果,它可以捕捉问题所在。但是还有很多其他的可能性,直到后来才会被注意到,甚至可能会导致在程序退出后发生腐败(例如,如果在现在的可用内存中分配了文件写入缓冲区)。 – 2010-02-15 02:38:11

3

让我们(pseudocoded)现实世界的例子.Imagine,你有这样的一类:

class Street 
{ 
    public: 
     Street(); 
     ~Street(); 
    private: 
     int HouseNumbers_[]; 
} 

typedef *Street StreetSign; 

如果你有路牌的数组,您删除streetsigns的数组,即没有按”这意味着你会自动删除sreets。他们仍然在那里,砖头和灰浆,他们只是没有那些迹象指向他们了。你已经摆脱了那些特定的指向街道的例子。

指针数组(概念上)有点像一个整数数组,它是一个数组数组,代表各种对象的内存位置。这不是物体本身。

如果删除[]指针数组,则您所做的全部操作都是删除整数数组。