条款15 在资源管理类中提供对原始资源的访问
条款16 成对使用new和delete
条款17 使用独立语句将new的对象放入智能指针
在资源管理类中提供对原始资源的访问
提供get方法返回原始指针
obj.get();
尽量不使用隐式转换。
成对使用new和delete
std::string* strArr = new std::string[100];
...
delete strArr;
显然会有99个string不太可能被正常删除。
应该使用
delete [] strArr;
不过最好使用STL提供的容器
使用独立语句将new的对象放入智能指针
例如一个需要处理程序优先权的函数。
int priority();
void processWidget(shared_ptr<Widget> pw, int priority);
假如如下使用
processWidget(shared_ptr<Widget>(new Widget), priority());
这个函数执行的步骤如下:
- 调用priority
- 执行new Widget
- 调用shared_ptr构造函数
其中调用priority应该是不同编译器有不同选择。
假如这样执行
- 执行new Widget
- 调用priority
- 调用shared_ptr构造函数
但是假如priority抛出异常,new Widget返回的指针可能就丢失。
内存泄露。
所以安全的做法是:
shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority())