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

时间:2012-07-16 21:47:44

标签: c++ pointers

一个问题:

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

#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;
};

在SomeObject实例中,aObj也会在其他情况下重用。我可以继续拨打SomeObject::getInstance()->getAObjPointer()以获取我需要的所有内容,但在我个人看来,SomeObject::getInstance()->getAObjPointer()->GetSomeIntValue()并不像aObj->GetSomeIntValue()那样可读。 我知道如果我使用了boost(shared_ptr,weak_ptr甚至auto_ptr)中的东西我就不用担心了,但我对它的工作方式更加好奇。不会删除指针会产生内存泄漏情况,还是删除指针会将其从内存中删除,以便它会在其他范围(实例对象以及可能使用的其他任何位置)中消失?

有什么想法?

干杯。

3 个答案:

答案 0 :(得分:5)

取决于。

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

另外,您的“安全删除”:

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

应该在API中记录。

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

假设您实际上已经为自己编写了这个类和函数,如果您不在其他任何地方使用此实例(包括在内部函数中),您可能希望删除函数末尾的指针。