数组auto_ptr, unique_ptr和shared_ptr的设计行为
Design Behavior of auto_ptr, unique_ptr and shared_ptr for arrays
通过了解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。事实上,在右值引用被发明之前,几乎没有希望为标准容器设计一个具有异常安全性的防弹智能指针。
相关文章:
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- CLANG 编译器 说:变量"PTR"可能未初始化
- 如何在自定义类中启用'auto loops'?
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 为什么结构化绑定不使用"auto&"返回对结构成员的引用,而是返回成员本身
- 擦除许多矢量元素,同时使用'auto'
- 考虑到其他好处,关键字'auto'真的有助于简化调试C++吗?
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- 推理类型如何工作"auto"和按引用调用?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 'auto *x = new some_struct{};"是一个未初始化的变量?
- 为什么 std::gcd/lcm 返回 std::common_type_t<M, N> 而不是 auto?
- 将函数参数类型声明为 auto