TheRiver | blog

You have reached the world's edge, none but devils play past here

0%

c++11 auto_ptr unique_ptr

前言

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(auto_ptr& __a) throw() : _M_ptr(__a.release()) { }

//operator =
auto_ptr&
operator=(auto_ptr& __a) throw()
{
reset(__a.release());
return *this;
}

//release函数
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
// Move constructors.
unique_ptr(unique_ptr&& __u) noexcept
: _M_t(__u.release(), std::forward<deleter_type>(__u.get_deleter())) { }

// Disable copy from lvalue.
unique_ptr(const unique_ptr&) = delete;
unique_ptr& operator=(const unique_ptr&) = delete;

//release
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

070902.jpg

----------- ending -----------