6

一个问题:

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

#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

3 回答 3

5

这取决于。

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

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

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

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

于 2012-07-16T21:50:09.807 回答
0

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

于 2012-07-16T21:49:44.560 回答
0

它应该记录在 API 中。

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

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

于 2012-07-16T21:57:16.510 回答