C ++删除指向指针的指针

C ++删除指向指针的指针

C++ deleting a pointer to a pointer

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

1
delete [] PointerToPointers;

那会不会也删除所有指向指针的指针? 如果不是,是否必须遍历所有指针并将其删除,还是有更简单的方法呢? 我的google-fu似乎对这个问题没有给我任何好的答案。

(是的,我知道我需要使用向量。这是学校中的"赶上C ++"类型分配之一)。


是的,您必须遍历指针,逐个删除。

原因:如果其他代码具有指向数组中对象的指针,该怎么办? C ++编译器不知道这是否成立,因此必须明确。

对于"简便的方法",有两个建议:(1)为此目的创建一个子例程,这样至少您不必多次编写代码。 (2)使用"智能指针"设计范例,其中包含带有引用计数器的对象数组,然后当不再由任何代码引用对象时,将删除对象。


我同意Jason Cohen的观点,尽管我们可以更清楚地知道需要使用循环删除指针的原因。对于每个"新"或动态内存分配,都需要"删除"内存取消分配。有时可以像智能指针一样隐藏"删除",但它仍然存在。

1
2
3
4
int main()
{
  int *pI = new int;
  int *pArr = new int[10];

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

1
2
  delete pI;
  delete [] pArr;

这些删除语句清除了由" new"分配的内存

1
2
3
4
5
6
  int ppArr = new int *[10];

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

这部分代码正在完成之前的两个分配。首先,我们在动态数组中为int创建空间。然后,我们需要遍历并为数组中的每个点分配一个int。

1
2
3
4
5
  for( int indx = 0; indx < 10; ++indx )
  {
    delete ppArr[indx];
  }
  delete [] ppArr;

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

1
2
3
4
5
6
7
8
9
  int a=0;
  int b=1;
  int c=2;

  ppArr = new int *[3];

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

我认为也应提及这一点。仅仅因为您正在使用指针,并不意味着这些指针指向的内存是动态分配的。就是说,仅仅因为您有一个指针并不意味着必须删除它。我在这里创建的数组是动态分配的,但是指针指向int的本地实例。删除该数组时,我们只需要删除该数组即可。

1
2
3
4
5
  delete [] ppArr;

  return 0;

}

最后,动态分配的内存可能很棘手,无论如何,您都可以像使用智能指针一样安全地将其包装起来,或者使用stl容器来包装它,然后使用自己的内存可以使您的生活更加愉悦。


请参阅boost指针容器,以获取一种为您自动删除包含的指针,同时保持与普通STL容器非常相似的语法的容器。


让我们以一个(伪编码的)现实世界示例为例,假设您有一个这样的类:

1
2
3
4
5
6
7
8
9
10
class Street
{
    public:
        Street();
        ~Street();
    private:
        int HouseNumbers_[];
}

typedef *Street StreetSign;

如果您有一系列的路标,并且删除了一系列的路标,则并不意味着您会自动删除这些街道。 他们仍然在那里,用砖头和灰浆,他们只是不再有那些迹象指向他们。 您已经摆脱了指向街道的那些特定实例。

指针数组在概念上有点像整数数组,它是一个数字数组,代表各个对象的存储位置。 不是物体本身。

如果您删除指针数组[],那么您要做的就是删除整数数组。


指针几乎只是内存引用,而不是一些小的自洁.net对象。为每个类创建适当的析构函数将使删除操作比整个代码中的大量循环更干净。


我认为恐怕您将不得不进行循环。


我不知道为什么这么长时间才回答这个问题。

如果删除指针数组,则将释放
通常为int数组的内存。
指向对象的指针是包含地址的整数。

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

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

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

这就是为什么您必须首先循环遍历数组的原因!并致电删除
在每个元素上,则可以删除数组本身的存储。

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

编辑:
杰森的答案是没有错的,只是没有达到目的。都没有
编译器或c(++)中的任何其他程序都关心您删除其他地方的内容
指向。您可以做到。其他程序部分尝试使用已删除的对象
会在你身上断断续续。但是没有人会阻碍你。
当对象被销毁时,销毁对象的指针数组也不是问题。
在其他地方引用。


推荐阅读