要成对使用new和delete
这个可以参考我的这篇内存构造
这条款需要记住的就是,到写代码时只能按照下面的格式:
T* p = new T();
delete p;
//
T* p = new T[100];
delete [] p;
以独立语句将new对象置于智能指针
这里书中举了一个小例子
#include <memory>
class Widget;
int Priority();
void Process(shared_ptr<Widget> para, int num);
//下面这种方式不行,因为shared_ptr的构造函数是explicit的
//Process(new Widget(), Priority());
Process(shared_ptr<Widget>(new Widget()), Priority());
理论认为执行流程:
- new Widget()
- shared_ptr()
- Priority()
上面这段代码有个问题,C++编译器不保证参数执行顺序
, 所以会出现下面的离谱事件:
- new Widget()
- Priority()
- shared_ptr()
编译器除了保证你Widget构造在shared_ptr构造之前,对于Priority不保证,所以当Priority()挂掉的时候,new Widget出来的资源压根没有进入资源管理类,为了避免这种问题:
shared_ptr<Widget> tmp(new Widget()); //以独立的语句将new的对象置于智能指针,这个以前真没留意过。
Process(tmp, Priority());