前言
auto_ptr在c++11已经废弃,现在用unique_ptr替代
区别
auto_ptr出现的意义就是它是一个类,可以利用析构函数来释放内存,相当于内存守卫类。主要和unique_ptr的区别在于拷贝赋值的实现:
auto_ptr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| auto_ptr(auto_ptr& __a) throw() : _M_ptr(__a.release()) { }
auto_ptr& operator=(auto_ptr& __a) throw() { reset(__a.release()); return *this; }
element_type* release() throw() { element_type* __tmp = _M_ptr; _M_ptr = 0; return __tmp; }
|
unique_ptr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| unique_ptr(unique_ptr&& __u) noexcept : _M_t(__u.release(), std::forward<deleter_type>(__u.get_deleter())) { }
unique_ptr(const unique_ptr&) = delete; unique_ptr& operator=(const unique_ptr&) = delete;
pointer release() noexcept { pointer __p = get(); std::get<0>(_M_t) = pointer(); return __p; }
|
这样做的考虑是:
- 将auto_ptr可能的运行期错误在编译期暴露出来(悬空指针)
- unique_ptr是move-only的
- unique_ptr支持数组元素作为模板( class unique_ptr<_Tp[], _Dp>)
好多地方说的很多,其实主要区别就是这样,至于其他的一些东西可能是无关本身的,引入了其他新的概念。真正麻烦的是shared_ptr,以后总结
deletor
todo
ENDDING