设计数组的auto_ptr,unique_ptr和shared_ptr的行为

时间:2013-05-11 13:30:19

标签: c++ c++11

了解auto_ptr,unique_ptr和shared_ptr时我才知道auto_ptr析构函数使用delete,而不是delete [] unique_ptr确实正确处理它。

auto_ptr<char> aptr(new char[100]);
unique_ptr<char []> uptr(new char[100]);

无论如何在c ++ 11中不推荐使用auto_ptr。我知道unique_ptr比auto_ptr有更多的功能。 我有两个与此行为相关的问题

a)为什么在设计c ++标准库团队的auto_ptr行为时没有考虑到它对数组的缺点。

b)即使在c ++ 11中引入了shared_ptr,为什么它的实现不支持删除数组?

2 个答案:

答案 0 :(得分:4)

  

为什么c ++标准库团队为auto_ptr设计行为时没有考虑到它对数组的缺点。

我无法评论为什么auto_ptr设计得不是很好;我只能观察到它不是,这就是它现在被弃用的原因。这并不值得担心;只是假装它从未存在过。

  

即使在c ++ 11中引入了shared_ptr,为什么它的实现不支持删除数组?

它支持任意删除者,所以你可以这样做;只比unique_ptr稍微方便一点:

std::shared_ptr<int> p(new int[42], std::default_delete<int[]>());

答案 1 :(得分:1)

以下是对auto_ptr折磨历史的一个很好的解读:http://www.aristeia.com/BookErrata/auto_ptr-update.html。事实是,在发明右值参考之前,设计防弹智能指针几乎没有希望,标准容器具有异常安全性。