我应该删除函数中的本地指针吗? (C++)

问题描述:

一个问题:我应该删除函数中的本地指针吗? (C++)

我应该删除在函数中获取的指针(不是创建,只是提取)?示例:

#include <SomeObject> 

#define SAFE_DELETE(p) { if (p) { delete (p); (p) = NULL; } } 

class DraftObject 
{ 
public: 

    DraftObject() : _x(0) {} 
    ~DraftObject(){} 

    int CalculateSomething() 
    { 
     AnotherObject* aObj = SomeObject::getInstance()->getAObjPointer(); 

     /* Do some calculations and etc... */ 
     _x += aObj->GetSomeIntValue(); 

     SAFE_DELETE(aObj) // <-- Would you recomend this here? 

     return _x; 
    } 

protected: 
    int _x; 
}; 

aObj在其他情况下也会在SomeObject实例中重用。我可以继续,并且总是拨打SomeObject::getInstance()->getAObjPointer()来满足我需要的所有内容,但我个人认为SomeObject::getInstance()->getAObjPointer()->GetSomeIntValue()的可读性不如aObj->GetSomeIntValue()。 我知道,如果我使用boost(shared_ptr,weak_ptr或auto_ptr),我不需要担心,但是我对它的工作方式更加好奇。不会删除指针会产生内存泄漏情况,或者删除指针会将其从内存中删除,以便在其他作用域(实例对象以及可能使用的任何其他位置)中消失?

有什么想法?

干杯。

+4

'删除'你'新'。 – chris 2012-07-16 21:48:48

+2

请注意'delete 0;'是一个空操作符。 – hmjd 2012-07-16 21:49:15

+0

如果'getAObjPointer'只返回一个引用,那么你不应该删除它。如果在被叫位置有任何新操作,则必须将其删除。否则你有参考悬而未决。 – Mahesh 2012-07-16 21:50:22

这取决于。

如果SomeObject::getInstance()->getAObjPointer();每个调用返回一个不同的对象,可能是。否则,不。 这应该记录在

而且,你的 “安全删除”:

#define SAFE_DELETE(p) { if (p) { delete (p); (p) = NULL; } } 

毫无用处。而且丑陋。如果我在代码中看到这个,我会去嘲笑编写它的程序员。如果pNULL,则删除是安全的。

+0

我同意。 SAFE_DELETE的东西完全没用。 – 2012-07-16 21:52:44

+6

我不喜欢“取笑”部分。 – 2012-07-16 21:53:36

+0

@NisonMaël我认为你只是写道:P – 2012-07-16 21:55:12

不,请不要使用delete,因为这会为对象释放内存,并且以后将无法使用它。

+0

您如何知道每次调用都不会返回一个新对象?如果是这样,那就是内存泄漏。 – 2012-07-16 21:51:03

+0

我认为这就是OP的意思,当他说:“在SomeObject实例中,aObj还会在其他情况下重用。”尽管这是一个非常不明确的问题。 – 2012-07-17 00:09:45

它应该记录在API中。

一些库返回的指针不应该被用户删除,因为它们也保存在内部数据结构中。其他人正在创建应该由用户删除的指针。

假设你实际上已经为自己写了这个类和函数,如果你没有在其他任何地方(包括内部函数)使用这个实例,你可能想要删除函数末尾的指针。

+0

在我的特殊情况下,该对象在实例上创建并重复使用多次,而不是在DraftObject的末尾解除分配。使用后不删除它是我正在寻找的答案。谢谢。 – karmalis 2012-07-16 22:10:31

+0

@ karmalis那么你应该_接受答案 – 2012-07-17 04:30:45