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

delete [] PointerToPointers;

这也会删除所有指向的指针吗?如果没有,我是否必须循环所有指针并删除它们,或者是否有更简单的方法来做到这一点?我的 google-fu 似乎没有给我这个问题任何好的答案。

(是的,我知道我需要使用向量。这是学校里“赶上 C++”类型的作业之一。)

有帮助吗?

解决方案

是的,您必须循环遍历指针,单独删除。

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

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

其他提示

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

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

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

  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;

请注意我分配此内存的顺序,然后以相反的顺序取消分配它。这是因为如果我们要执行删除[] 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 容器非常接近的语法。

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

让我们举一个(伪编码的)现实世界的例子。想象一下你有一个这样的类:

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

typedef *Street StreetSign;

如果您有一组街道标志,并且删除了一组街道标志,这并不意味着您会自动删除街道。它们仍然在那里,砖块和灰泥,只是不再有那些标志指向它们。你已经摆脱了 那些具体的 指向街道的指针的实例。

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

如果你删除[]指针数组,你所做的只是删除一个整数数组。

我想恐怕你得循环一遍。

我不知道为什么这个问题的答案这么长。

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

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

删除不在乎内存空间的内容,而是称为灾难,并将MEM标记为免费。

它并不关心它只是删除了一堆对象,它只是看到了int。

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

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

编辑:杰森的回答并没有错,只是没有击中要害。C(++)中的编译器或其他任何内容都不关心您删除其他位置的内容。你就可以这么做。试图使用已删除对象的其他程序零件将对您进行了解。但没有人会阻碍你。当对象在其他地方引用对象时,销毁对象的一系列指针也不是一个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top