0%

以独立语句将newed对象置入智能指针

看下面的例子:

1
2
3
4
5
6
7
8
9
10
11
class Widget { ... };

int priority() { ... }

void processWidget(std::shared_ptr<Widget> pw, int priority) { ... }

int mian() {
...;
processWidget(std::shared_ptr<Widget>(new Widget), priority());
...;
}

在调用processWidget函数之前,编译器创建代码会做三件事:

1、调用priority

2、执行”new Widget”

3、调用std::share_ptr的构造函数

但是C++编译器以什么样的次序完成这件事是不确定,唯一确定的顺序是”new Widget”一定在调用std::share_ptr的构造函数之前,编译器有可能在第二步执行调用priority函数。如果此时priority函数的调用发生异常,此时”new Widget”返回的指针可能将会遗失,此时可能引发资源泄漏。为了避免这个问题,最好把创建Widget的语句单独拿出来:

1
2
3
4
5
6
void main() {
...;
std::shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority());
...;
}