如何删除指针指针?

时间:2010-10-06 18:36:40

标签: c++

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

谢谢!

5 个答案:

答案 0 :(得分:7)

删除指向指针的指针:

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
}

答案 1 :(得分: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 ...或任何其他动态(堆)分配。 但是你可能在堆栈上分配了指针,所以你不需要清理它。在他的范围的末尾,清理范围中使用的堆栈上的内存。

答案 2 :(得分:0)

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

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

<强> 2。通过解除引用一次删除您获得的数据(指针),即myPtrToPtr

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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