【发布时间】:2018-07-10 00:12:21
【问题描述】:
std::default_deletecan be specialized 允许std::unique_ptrs 到painlessly manage types which have to be destroyed by calling some custom destroy-function instead of using delete p;。
在 C++ 中,基本上有两种方法可以确保对象由 std::shared_ptr 管理:
使用
std::make_shared或std::allocate_shared创建由共享指针管理的它。这是首选方式,因为它将所需的两个内存块(有效负载和引用计数)合并为一个。虽然只剩下std::weak_ptrs,但对引用计数的需求仍然必然会限制有效负载的内存。之后使用a constructor 或
.reset()将管理分配给共享指针。
第二种情况,当不提供自定义删除器时很有趣:
具体来说,它被定义为使用自己的未指定类型的删除器,分别使用delete [] p; 或delete p;,这取决于是否为数组实例化std::shared_ptr。
引自 n4659 (~C++17):
template<class Y> explicit shared_ptr(Y* p);4 要求:
Y应为完整类型。表达式delete[] p,当T是数组类型时,或delete p,当T不是数组类型时,应具有良好定义的行为,并且不应抛出异常。
5 效果:当T不是Array类型时,构造一个拥有指针p的shared_ptr对象。否则,构造一个拥有p的shared_ptr和一个调用delete[] p的未指定类型的删除器。当T不是数组类型时,启用shared_from_this和p。如果抛出异常,当T不是数组类型时调用delete p,否则调用delete[] p。
6 后置条件:use_count() == 1 && get() == p.
[…]template<class Y> void reset(Y* p);3 效果:相当于
shared_ptr(p).swap(*this)。
我的问题是:
- 是否有一个最好的理由没有指定使用
std::default_delete来代替? - 任何有效的(并且可能有用的?)代码会被该更改破坏吗?
- 是否已有建议这样做?
【问题讨论】:
-
嗯,你的专业必须“满足原始模板的标准库要求”,部分要求是它调用
delete(或delete[])。我不明白您如何合法地将其专门用于做其他事情。 -
当使用与实例相同的内存块创建控制块时,默认删除是否仍然有效。 (弱指针需要不同的破坏时刻)
-
@T.C.特化以唯一正确的方式删除对象。基本模板可能是错误的,所以没问题。
-
@JVApen:如果
std::make_shared或std::allocate_shared合并两个分配,则不使用单独的删除器。这只是问题的背景。
标签: c++ default shared-ptr delete-operator c++20