如何删除指向指针的指针?

5

在C++中,如果你将一个指向指针的指针传递给一个方法,你需要首先删除被引用的指针吗?你需要在方法内部清理它吗?我在任务管理器中检查内存,发现有泄漏!

谢谢!


5
一个具体的例子会很有帮助。 - Greg Hewgill
5个回答

8
您可以按照以下方式删除指向指针的指针:
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
}

谢谢!我需要在方法内删除引用指针,因为它在方法外不再需要。 - Moderator71

3

"指向指针的指针" ?

例如,如果您有:

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或任何其他动态(堆)分配,为什么需要清除指针?但是,您可能在分配指针的堆栈上,因此不需要清除它。在其范围结束时,用于作用域中的堆栈内存会被清除。


0

你应该从底部开始,向上走。否则,你将失去对链式引用中下游数据引用的参考!

1. 删除两次取消引用后得到的数据,即*myPtrToPtr

2. 删除一次取消引用后得到的数据(指针),即myPtrToPtr

当然,只有在指针和它所指向的东西都是动态分配的情况下才这样做。

但我同意评论者的观点……更具体的信息会有助于我们理解上下文。


0

如果有内存泄漏,你必须先删除被引用的指针,然后再删除引用指针。一旦你删除了引用指针,访问被引用指针的存储将是未定义的行为,因为你刚刚销毁了该对象。


0

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

如果您必须销毁指向您拥有的指针的指针,则需要先销毁引用的指针或在销毁另一个指针之前暂时保存其值。

但是,在进行猜测之前,您应该考虑使用类似于valgrind/purify或等效的内存检查工具,并考虑谁拥有什么(即:谁应该销毁谁)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接