我应该删除函数中的本地指针吗?(C++)
Should I delete local pointers in functions? (C++)
一个问题:
我应该删除在函数中提取的指针吗(不是创建的,只是提取的)?示例:
#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; } }
是完全无用的。而且很丑。如果我在代码中看到这一点,我会去取笑写它的程序员。如果p
是NULL
,那么删除是安全的。
不,不要使用delete
,因为这将取消分配对象的内存,以后将无法使用它。
它应该记录在API中。
有些库返回的指针不应该被用户删除,因为它们也保存在内部数据结构中。其他人正在创建应该由用户删除的指针。
假设您实际上已经为自己编写了这个类和函数,如果您不在其他任何地方使用该实例(包括内部函数),则可能需要删除函数末尾的指针。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错