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

Should I delete local pointers in functions? (C++)

本文关键字:C++ 指针 函数 删除 我应该      更新时间:2023-10-16

一个问题:

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

#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),我不需要担心,但我更好奇它的工作方式。不删除指针会导致内存泄漏吗?还是删除指针会将其从内存中删除,从而使其在其他范围(实例对象以及可能使用的其他任何位置)中消失?

有什么想法吗?

干杯。

这取决于情况。

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

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

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

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

不,不要使用delete,因为这将取消分配对象的内存,以后将无法使用它。

它应该记录在API中。

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

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