繁体   English   中英

如何删除指针指针?

[英]How to delete a pointer to a pointer?

在C ++中,如果将指针传递给方法指针,是否首先删除引用的指针? 你需要在方法中清理它吗? 我正在检查任务管理器中的内存,它正在泄漏!

谢谢!!

您删除指向指针的指针,如下所示:

int** p = 0;
p = new int*;  // create first pointee 
*p = new int;  // create 2nd pointee
**p = 0;       // assign 2nd pointee
// free everything
delete *p;     
delete p;

删除传递给方法的指针对我来说似乎很不寻常。 但无论如何:

void freeme(int **p) {
    delete *p;
    *p = 0;
}

int main() {
    int *a = new int;
    *a = 3; 
    freeme(&a);
    // a == 0 now
}

“指向指针的指针”?

如果例如你有:

MyClass * obj_ptr = new Myclass();
MyClass ** obj_ptr_ptr = &obj_ptr;

//then if you want to clean do :

delete (*obj_ptr_ptr);//to clean the class instance.

为什么需要清理指针...如果您只使用malloc ...或任何其他动态(堆)分配。 但是你可能在堆栈上分配了指针,所以你不需要清理它。 在他的范围的末尾,清理范围中使用的堆栈上的内存。

你应该从底部开始,然后上去。 否则,您将失去对引用链下方数据引用的引用!

1.通过解除引用两次删除您获得的数据,即*myPtrToPtr

2.通过解除引用一次删除所获得的数据(指针),即myPtrToPtr

但是,当然,只有在指针和它指向的东西都被动态分配时才这样做。

我同意评论者的意见......更具体的内容会对我们提供一些背景信息。

如果它正在泄漏,则必须先删除引用的指针,然后删除引用指针。 删除引用指针后,访问引用指针的存储将是未定义的行为,因为您刚刚销毁了该对象。

在考虑销毁之前,首先需要定义谁是每个指针的所有者。

如果你必须销毁一个指向你拥有的指针的指针,那么你需要先破坏引用的指针,或者在销毁另一个指针之前暂时保存它的值。

但你应该考虑使用像valgrind / purify或等效的内存检查工具,并在做出疯狂猜测之前考虑谁拥有什么(即:谁应该摧毁谁)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM