条款11:如果class内动态配置有内存,请为此class声明一个copy constructor和一个assignment运算符
在内存分配的时候,增加copy和assignment运算符没有问题,可是在很多情况下仅仅通过增加copy和assignment还不能完成任务,我自己就碰到过这种问题:
class CMyLibrary
{
public:
CMyLibrary(LPCTSTR lpszLibName)
{
m_hInst = ::LoadLibrary(lpszLibName);
}
~CMyLibrary()
{
if (m_hInst)
{
::FreeLibrary(m_hInst);
}
}
private:
HINSTANCE m_hInst;
}
实现这个类用于管理DLL,在这种情况下就很难实现copy和assignment功能,因为我们还没有办法Copy出一个HINSTANCE。我们也许可以采用attach功能的实现,在copy和assignment函数中传入的时候没有const值,允许copy和assignment函数修改其值。这当然是一种方法,终归不是最优方法,不仅失去了copy和assignment操作符的原意,而且还失去了强大的const作用(犯了第一条)。后来我自己实现了一个share_library类,在这个share_library类中采用引用计数来管理HINSTANCE句柄,在每次调用copy和assignment的功能的时候,自身的引用计数减1,把传入值的引用计数加1,类似于COM的设计,而且这样工作的非常好。
待续……