Effective C++读书笔记(11) (二)

2014-11-24 12:20:04 · 作者: · 浏览: 1
r被创建的 DLL 中。这就意味着,例如,如果 Stock 是一个继承自 Investment 的类,而且 createInvestment 被实现如下,

std::tr1::shared_ptrcreateInvestment()
{return std::tr1::shared_ptr(new Stock);}

返回的tr1::shared_ptr能在DLL之间进行传递,而不必关心cross-DLL问题。指向这个 Stock 的 tr1::shared_ptr 将保持对“当这个 Stock 的引用计数变为零的时候,哪一个 DLL 的delete应该被使用”的跟踪。

tr1::shared_ptr是一个消除某些客户错误的简单方法,值得我们核计其使用成本。最通用的 tr1::shared_ptr 实现来自于 Boost,其shared_ptr的大小是原始指针的两倍,以动态分配内存用于簿记用途和deleter专属数据,当调用它的deleter时使用一个virtual函数来调用,并在多线程程序修改引用次数时蒙受线程同步化的额外开销(你可以通过定义一个预处理符号来使多线程支持失效。)。在缺点方面,它比一个原始指针大且慢,而且要使用辅助动态内存。在许多应用程序中,这些附加的运行时开销并不显著,而对客户错误的减少却是每一个人都看得见的。

· 好的接口易于正确使用,而难以错误使用。你应该在你的所有接口中为这个特性努力。

· tr1::shared_ptr 支持自定义 deleter。这可以防止 cross-DLL 问题,能用于自动解锁互斥体(mutex)等。

摘自 pandawuwyj的专栏