繁体   English   中英

删除指针

[英]Deleting a pointer

在C ++中,推荐的删除指针的方法是什么? 例如,在以下情况下,我是否需要全部三行安全地删除指针(如果是,它们将做什么)?

// Create
MyClass* myObject;
myObject = new MyClass(myVarA, myVarB, myVarC);

// Use
// ...

// Delete
if(myObject) { 
    delete myObject; 
    myObject = NULL; 
}

不,您不需要检查NULL
如果传递的指针为NULLdelete会小心。

delete myObject; 
myObject = NULL; 

足够了。

作为一般策略,请避免在任何可能的地方使用免费存储分配,并且如果必须使用Smart Pointers( RAII代替原始指针。


C ++ 03标准节§3.7.3.2.3:

提供给标准库中提供的一个释放函数的第一个参数的值可以为空指针值; 如果是这样,则对释放函数的调用无效 否则,提供给标准库中的运算符delete(void *)的值应为标准库中运算符new(size_t)或运算符new(size_t,const std :: nothrow_t&)先前调用返回的值之一。 ,并且标准库中提供给operator delete的值应为先前调用标准库中的operator new或operator new [](size_t,const std :: nothrow_t&)之前返回的值之一。

不,您不需要那。

只需编写delete p ,并确保不要接受任何主张您做更多事情的人的其他建议。

一般建议:避免进食生newdelete 让一些标准容器处理分配,复制和释放。 或使用智能指针。

干杯,……

最好使用资源管理类,并让该库为您处理:

#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!
}

只是添加将其delete后将指针设置为NULL是一个好主意,因此您不会留下任何悬空的指针,因为尝试取消引用NULL指针可能会立即使您的应用程序崩溃(因此相对容易进行调试),而取消引用悬空指针将很可能在某个随机点使您的应用程序崩溃,并且更难追踪和修复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM