boost库中的智能指针shared_ptr, 功能强大, 且开销小,故受到广大coder的欢迎。
但在实际的使用过程中,笔者也发现了一些不足。
1、定制的删除器
shared_ptr除了可以使用默认的delete删除器来删除资源, 也可以定制删除器来删除资源, 但是删除的时候没有办法返回值, 这应该可以算是一个缺陷。
如对于文件句柄的操作
bool CFileIO::Open(LPCTSTR fileName, LPCTSTR mode)
{
m_pFile.reset(_tfopen(fileName, mode), fclose);
return m_pFile.unique();
}
bool CFileIO::Close(void)
{
m_pFile.reset();
return true;
}
这时候Close没有办法返回实际的操作状态。
2、函数没有办法把shared_ptr中保存的原始指针直接返回, 因为share_ptr在函数返回后会自动销毁,因此对应的资源也会被释放。如
T *GetObject()
{
shared_ptr<T> ret;
...
return ret.get();
}
究其原因,是因为shared_ptr没有一个接口, 可以像std::auto_ptr的release来手动释放所有权, 因此这种情况下只能使用auto_ptr了。
3、对于shared_ptr为什么不引出接口operator T*() const, 我感到很奇怪。因为若是一个接口的形式如下
template<class T>
void func(T *p);
这个时候如果直接传shared_ptr变量会编译出错。
4、智能指针的陷阱
在一个对象的析构函数里再把它传入某个智能指针对象,这样会引起循环析构。
如:
class CObject { ~CObject(); } CObject::~CObject() { test(this); } void test(boost::shared_ptr<CObject> object) { }