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

时间:2008-09-07 03:19:36

标签: c++ pointers

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

delete [] PointerToPointers;

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

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

7 个答案:

答案 0 :(得分:29)

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

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

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

答案 1 :(得分:18)

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

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

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

  delete pI;
  delete [] pArr;

这些删除语句清除了“new”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容器而不是你自己可以让你的生活更愉快。

答案 2 :(得分:4)

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

答案 3 :(得分:3)

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

答案 4 :(得分:3)

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

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

typedef *Street StreetSign;

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

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

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

答案 5 :(得分:1)

我认为你恐怕不得不徘徊。

答案 6 :(得分:0)

我不知道为什么这回答得如此混乱。

如果删除指针数组,则会释放 用于一般数组的内存。
指向对象的指针是包含地址的整数。

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

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

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

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

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

编辑: 杰森的回答没有错,它只是没有碰到现场。也不 编译器或c(++)中的任何其他东西都关心你删除其他地方的东西 指着。你可以做到。尝试使用已删除对象的其他程序部分 会对你有所不同。但没有人会阻碍你。 在对象时销毁对象的指针数组也不是问题 在其他地方引用。