前言:读《超越c++标准库——boost程序库导论》的笔记。
(一)scoped_ptr
- boost::scoped_ptr 用于确保能够正确地删除动态分配的对象。scoped_ptr 有着与std::auto_ptr类似的特性,而最大的区别在于它不能转让所有权而auto_ptr可以。事实上,scoped_ptr永远不能被复制或被赋值!scoped_ptr 拥有它所指向的资源的所有权,并永远不会放弃这个所有权。
- 它是一种轻量级的智能指针
- scoped_ptr的构造函数explicit scoped_ptr(T* p=0)的参数必须是用operator new分配的,或者是null。
与std::auto_ptr一样,由于析构函数使用delete,而非delete[]删除资源,所以参数不能指向数组,如:
boost::scoped_ptr<char> p(new char[20]);
将导致资源泄露。这里完全可用std::string之类的容器代替。
- 你的词典里有了scoped_ptr,你就应该使用它,因为它可以更清楚地表明你的意图。如果你想说一个资源是要被限制在作用域里的,并且不应该有办法可以放弃它的所有权,你就应该用 boost::scoped_ptr.
- 使用裸指针来写异常安全和无错误的代码是很复杂的。使用智能指针来自动地把动态分配对象的生存期限制在一个明确的范围之内,是解决这种问题的一个有效的方法,并且提高了代码的可读性、可维护性和质量。
- scoped_ptr不提供拷贝构造函数,以及operator=、operator==和operator!=。
typedef scoped_ptr<T> this_type;
void operator==( scoped_ptr const& ) const;
void operator!=( scoped_ptr const& ) const;
在以下情况时使用 scoped_ptr :
-
在可能有异常抛出的作用域里使用指针
-
函数里有几条控制路径
-
动态分配对象的生存期应被限制于特定的作用域内
-
异常安全非常重要时(始终如此!)
-
(二)scoped_array
- 由于boost::scoped_ptr不能指向数组,所以有了boost::scoped_array。原因:scoped_array是一个单独的类而不是scoped_ptr的一个特化的原因是,因为不可能用元编程技术来区分指向单个对象的指针和指向数组的指针。不管如何努力,也没有人能发现一种可靠的方法,因为数组太容易退化为指针了,这使得没有类型信息可以表示它们是指向数组的。结果,只能由你来负责用scoped_array来代替scoped_ptr,就如你必须用delete[]操作符来代替delete操作符一样。
- 用处不大,最好还是使用std::vector,它更灵活、更强大。只有当你需要确保数组的大小是固定的时候,才使用scoped_array 来替代 std::vector.