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

C++ 我应该删除函数中的本地指针吗?(C+;+;),c++,pointers,C++,Pointers,问题: 我是否应该删除在函数中提取的指针(不是创建的,只是提取的)?例如: #包括 #定义SAFE_DELETE(p){if(p){DELETE(p);(p)=NULL;}} 类DraftObject { 公众: DraftObject():x(0){} ~DraftObject(){} int计算方法() { 另一个对象*aObj=SomeObject::getInstance()->getAObjPointer(); /*做一些计算等等*/ _x+=aObj->GetSomeIntValue

问题:

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

#包括
#定义SAFE_DELETE(p){if(p){DELETE(p);(p)=NULL;}}
类DraftObject
{
公众:
DraftObject():x(0){}
~DraftObject(){}
int计算方法()
{
另一个对象*aObj=SomeObject::getInstance()->getAObjPointer();
/*做一些计算等等*/
_x+=aObj->GetSomeIntValue();
安全删除(aObj)//getAObjPointer()
我需要它做的一切,但是
SomeObject::getInstance()->getAObjPointer()->GetSomeIntValue()
在我个人看来不如
aObj->GetSomeIntValue()可读。
我知道如果我使用了boost中的东西(shared_ptr、weak_ptr甚至auto_ptr),我就不必担心了,但我更好奇的是它的工作方式。删除指针会不会造成内存泄漏的情况,或者删除指针会不会从内存中删除它,从而使它在其他作用域中消失(实例对象以及可能使用它的任何其他地方)

有什么想法吗


干杯。

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

这取决于您的情况

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

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


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

应该在API中记录

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


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

delete
您所做的
new
。请注意,
delete 0;
是不可操作的。如果
getAObjPointer
只是返回一个引用,您不应该删除它。如果在被调用的位置有任何新操作,您必须删除它。否则,您的引用将挂起。@Mahesh如果它返回了引用,code不会编译。你不能将引用分配给指针(除非它是指针引用)。@Mahesh
int&foo()
返回引用,
int*foo()
返回指针。你怎么知道该方法不会每次调用都返回新对象?如果是,那就是内存泄漏。我想这就是OP说的意思“aObj将在其他情况下以及SomeObject实例中重复使用。”但这是一个非常不清楚的问题。我同意。安全删除内容完全没有用。我不喜欢“取笑”部分。@NisonMaël我想你刚刚写道:P@karmalis我是说你不应该使用宏,只要使用delete。@karmalis”在某些情况下,当您尝试删除空指针时,可能会遇到访问冲突。“你错了。你总是可以安全地删除空指针。在我的特殊情况下,对象在实例上创建并重复使用多次,而不是在DraftObject末尾取消分配。使用后不删除它是我想要的答案。谢谢。”。
#define SAFE_DELETE(p) { if (p) { delete (p); (p) = NULL; } }