0%

以对象管理资源

该条款针中的资源指的是用户动态申请的资源。看一个例子:

假设有一个工厂函数,用于生产某特定的Investment对象

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

Investment* createInvestment() {
return new Investment();
}

int main() {
...;
Investment* p = createInvestment();
...;
delete p;
}

在上例中,如果用户不知道createInvestment的内部实现,那么就不知道Investment是动态创建出来的,另外如果用户知道createInvestment是动态创建出来的,也很有可能忘记了要delete。所以好的方式是利用非动态对象来管理动态申请的资源,利用非动态对象的析构函数来释放资源。

1
2
3
4
5
int main() {
...;
std::shared_ptr<Investment> pInv(createInvestment());
...;
}

这种其实还有一个问题,就是用户很有可能忘记使用share_ptr来管理,所以最好直接让工厂函数返回一个shared_ptr。

1
2
3
std::shared_ptr<Investment> createInvestment() {
return share_ptr<Investment>(new Investment());
}

通常使用shared_ptr和unique_ptr就可以完成对动态申请的资源进行管理,但是某些情况下可能需要自己设计一个用于管理动态资源的对象