所以我有一个指针数组的指针.如果我这样删除它:
delete [] PointerToPointers;
那会删除所有指向的指针吗?如果没有,我是否必须遍历所有指针并删除它们,或者有更简单的方法吗?我的google-fu似乎没有给我任何关于这个问题的好答案.
(是的,我知道我需要使用一个向量.这是学校中"赶上C++"类型作业之一.)
是的,你必须遍历指针,单独删除.
原因:如果其他代码有指向数组中对象的指针怎么办?C++编译器不知道这是不是真的,所以你必须明确.
对于"更简单的方法",有两个建议:(1)为此目的制作一个子程序,这样至少你不必多次编写代码.(2)使用"智能指针"设计范例,其中您使用引用计数器保存对象数组,然后在任何代码不再引用对象时删除对象.
我同意杰森科恩,虽然我们可以更清楚地了解需要删除循环指针的原因.对于每个"新"或动态存储器分配,需要"删除"存储器解除分配.有时候"删除"可以被隐藏,就像智能指针一样,但它仍然存在.
int main() { int *pI = new int; int *pArr = new int[10];
到目前为止,我们在代码中分配了两个动态内存块.第一个是一般的int,第二个是一个int数组.
delete pI; delete [] pArr;
这些删除语句清除了"新"分配的内存
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容器而不是你自己可以让你的生活更愉快.