在C ++中,推荐删除指针的方法是什么?例如,在下面的例子中,我是否需要所有三行来安全地删除指针(如果是,它们会做什么)?
// Create
MyClass* myObject;
myObject = new MyClass(myVarA, myVarB, myVarC);
// Use
// ...
// Delete
if(myObject) {
delete myObject;
myObject = NULL;
}
答案 0 :(得分:6)
不,您不需要检查NULL
如果传递的指针是delete
,则NULL
会小心。
delete myObject;
myObject = NULL;
就足够了。
作为一般政策,请尽量避免使用freestore分配,并且必须使用智能指针(RAII)而不是原始指针。
C ++ 03标准部分§3.7.3.2.3:
提供给标准库中提供的一个释放函数的第一个参数的值可以是空指针值;如果是这样,对释放功能的调用无效。否则,标准库中提供给operator delete(void *)的值应该是之前调用标准库中的operator new(size_t)或operator new(size_t,const std :: nothrow_t&)返回的值之一。库,以及在标准库中提供给operator delete的值应该是之前在标准库中调用new new或operator new [](size_t,const std :: nothrow_t&)返回的值之一。
答案 1 :(得分:4)
不,你不需要那个。
只需写下delete p
,并且一定不要接受任何人提出建议你做更多事情的建议。
一般建议:避免原始new
和delete
。让一些标准容器处理分配,复制和释放。或使用智能指针。
干杯&第h。,
答案 2 :(得分:3)
最好使用资源管理类,让图书馆为您处理:
#include <memory>
void foo() // unique pointer
{
std::unique_ptr<MyClass> myObject(new Myclass(myVarA, myVarB, myVarC));
// ...
} // all clean
void goo() // shared pointer -- feel free to pass it around
{
auto myObject = std::make_shared<MyClass>(myVarA, myVarB, myVarC);
// ...
} // all clean
void hoo() // manual -- you better know what you're doing!
{
MyClass * myObject = new MyClass(myVarA, myVarB, myVarC);
// ...
delete myObject; // hope there wasn't an exception!
}
答案 3 :(得分:2)
只是添加指针在delete
'之后设置为NULL是一个好主意,所以你不要留下任何悬空指针,因为尝试取消引用NULL指针可能会直接导致你的应用程序崩溃离开(因此相对容易调试),而取消引用悬空指针很可能会使您的应用程序在某个随机点崩溃,并且更难以追踪和修复。