以对象管理资源
该条款针中的资源指的是用户动态申请的资源。看一个例子:
假设有一个工厂函数,用于生产某特定的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就可以完成对动态申请的资源进行管理,但是某些情况下可能需要自己设计一个用于管理动态资源的对象。