C ++零规则:多态删除和unique_ptr行为

阿伦

在最近的重载期刊中,主题为“执行零规则”,作者描述了如何避免编写五个运算符的规则,因为编写它们的原因是:

  1. 资源管理
  2. 多态删除

而且,可以通过使用智能指针来解决这两个问题。

在这里,我对第二部分特别感兴趣。

考虑以下代码片段:

class Base
{
public:
    virtual void Fun() = 0;
};


class Derived : public Base
{
public:

    ~Derived()
    {
        cout << "Derived::~Derived\n";
    }

    void Fun()
    {
        cout << "Derived::Fun\n";
    }
};


int main()
{
    shared_ptr<Base> pB = make_shared<Derived>();
    pB->Fun();
}

在这种情况下,正如本文的作者所解释的,我们通过使用共享指针来实现多态删除,并且确实可以实现。

但是,如果我更换shared_ptrunique_ptr,我不再能够观察到多态删除。

现在我的问题是,为什么这两种行为不同?为什么shared_ptr要照顾多态删除unique_ptr却不照顾呢?

弗洛里安·里库克斯(Florian Richoux)

您在这里有答案:https : //stackoverflow.com/a/22861890/2007142

引用:

一旦最后一个引用shared_ptr超出范围或被重置,~Derived()将被调用并释放内存。因此,您无需进行~Base()虚拟化。unique_ptr<Base>并且make_unique<Derived>不提供此功能,因为它们没有提供shared_ptr针对删除程序的机制,因为唯一指针要简单得多并且目标是最低的开销,因此不存储删除程序所需的额外功能指针。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++ unique_ptr和多态

来自分类Dev

使用unique_ptr的多态类的C ++ static_cast和dynamic_cast

来自分类Dev

用unique_ptr和自定义删除器包装C代码

来自分类Dev

C ++ 11使用unique_ptr和自定义删除器

来自分类Dev

unique_ptr,自定义删除器和零规则

来自分类Dev

智能指针(unique_ptr)自定义删除器错误C2027和C2338

来自分类Dev

C ++ 11 unique_ptr数组和构造函数参数

来自分类Dev

C ++:移至unique_ptr

来自分类Dev

C ++入门手册第5版:shared_ptr的删除器和unique_ptr的删除器之间的区别

来自分类Dev

C ++入门手册第5版:shared_ptr的删除器和unique_ptr的删除器之间的区别

来自分类Dev

对于使用C ++ 20销毁运算符delete的非多态派生类,则为unique_ptr

来自分类Dev

C ++ 11中unique_ptr的向量

来自分类Dev

C ++ unique_ptr常数参考

来自分类Dev

C ++-unique_ptr的类型转换/更改

来自分类Dev

C ++ unique_ptr和数组

来自分类Dev

C ++ LLVM unique_ptr问题

来自分类Dev

C ++ unique_ptr常数参考

来自分类Dev

C ++ unique_ptr和数组

来自分类Dev

错误C2280:尝试引用已删除的函数(unique_ptr)

来自分类Dev

C ++将删除的函数std :: unique_ptr与基类一起使用

来自分类Dev

unique_ptr,make_unique和多态

来自分类Dev

在C ++中使用`restrict`类型限定符和`unique_ptr`进行限制别名

来自分类Dev

Visual C ++中的双重检查锁定和unique_ptr静态初始化

来自分类Dev

c ++ typeid使用get()和*为同一unique_ptr返回不同的值

来自分类Dev

Visual C ++中的双重检查锁定和unique_ptr静态初始化

来自分类Dev

多态的数组unique_ptr

来自分类Dev

C ++ unique_ptr <Base>指向派生的ptr

来自分类Dev

C ++ unique_ptr <Base>指向派生的ptr

来自分类Dev

与C函数混合时出现C ++ unique_ptr错误

Related 相关文章

热门标签

归档