auto_ptr、unique_ptr和shared_ptr对数组的设计行为

4

在了解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) 为什么在设计auto_ptr的行为时,c++标准库团队没有考虑到它在数组上的缺点。
b) 即使在c++11中引入了shared_ptr,为什么它的实现不支持删除数组?

可能是重复的问题:为什么没有std::shared_ptr<T[]>的特化?(https://dev59.com/2Gox5IYBdhLWcg3wznk0) - Niko
你一开始就不应该使用普通数组。你可以使用一个指向std::arraystd::vector的智能指针,或者使用你选择的容器。 - stefan
2个回答

5
为什么C++标准库团队在设计auto_ptr的行为时没有考虑到它在数组中的缺点?
我无法评论为什么auto_ptr没有被很好地设计;我只能观察到它没有,这就是为什么它现在已经被弃用。不值得担心;就当它从未存在过。
此外,尽管shared_ptr在C++11中引入,但为什么它的实现不支持删除数组?
它支持任意删除器,因此您可以这样做;只是比unique_ptr稍微不方便些:
std::shared_ptr<int> p(new int[42], std::default_delete<int[]>());

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接