一个问题:
我应该删除在函数中提取的指针(未创建,只是获取)?例如:
#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)中的东西我就不用担心了,但我对它的工作方式更加好奇。不会删除指针会产生内存泄漏情况,还是删除指针会将其从内存中删除,以便它会在其他范围(实例对象以及可能使用的其他任何位置)中消失?
有什么想法?
干杯。
答案 0 :(得分:5)
取决于。
如果SomeObject::getInstance()->getAObjPointer();
每次调用都返回一个不同的对象,可能是的。否则,没有。 应记录。
另外,您的“安全删除”:
#define SAFE_DELETE(p) { if (p) { delete (p); (p) = NULL; } }
完全没用。而且丑陋。如果我在代码中看到这个,我会去嘲笑编写它的程序员。如果p
为NULL
,则删除是安全的。
答案 1 :(得分:0)
不,不要使用delete
,因为这会释放对象的内存,以后您将无法使用它。
答案 2 :(得分:0)
应该在API中记录。
有些库返回的指针不应被用户删除,因为它们也保存在内部数据结构中。其他人正在创建指针,应由用户删除。
假设您实际上已经为自己编写了这个类和函数,如果您不在其他任何地方使用此实例(包括在内部函数中),您可能希望删除函数末尾的指针。