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

Design Behavior of auto_ptr, unique_ptr and shared_ptr for arrays

本文关键字:ptr auto unique 数组 shared      更新时间:2023-10-16

通过了解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]);
无论如何,auto_ptr在c++11中已弃用。我知道unique_ptr比auto_ptr有更多的功能。关于这种行为,我有两个问题

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

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

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

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

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

它支持任意删除器,所以你可以这样做;只是比unique_ptr:

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

下面是auto_ptr的曲折历史:http://www.aristeia.com/BookErrata/auto_ptr-update.html。事实上,在右值引用被发明之前,几乎没有希望为标准容器设计一个具有异常安全性的防弹智能指针。