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

kar*_*lis 6 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;
};
Run Code Online (Sandbox Code Playgroud)

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

有什么想法吗?

干杯.

Luc*_*ore 5

这取决于.

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

另外,您的"安全删除":

#define SAFE_DELETE(p) { if (p) { delete (p); (p) = NULL; } }
Run Code Online (Sandbox Code Playgroud)

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

  • 我不喜欢"玩乐"的一部分. (7认同)
  • @karmalis"在某些情况下,当您尝试删除空指针时,可能会出现访问冲突." 你错了.您始终可以安全地删除空指针. (2认同)