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

时间:2020-03-05 18:48:52  来源:igfitidea点击:

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

delete [] PointerToPointers;

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

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

解决方案

回答

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

回答

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

回答

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

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

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

回答

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

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

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

delete pI;
  delete [] pArr;

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

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;

请注意,我分配了该内存,然后以相反的顺序取消了分配。这是因为如果我们要执行delete [] 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容器包装,然后使用自己的内存可以使生活更加愉悦。

回答

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

回答

我不知道为什么这么久才回答这个问题。

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

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

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

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

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

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

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

回答

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

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

typedef *Street StreetSign;

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

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

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