std :: shared_ptr如何删除带有受保护的析构函数的多态类型?

时间:2017-12-11 03:57:49

标签: c++ c++11 pointers

在以下示例中:

class Base {
    protected:
    ~Base() {
        cout << "B\n";
    }
};

class Derived : public Base {
    public:
    virtual ~Derived(){
        cout << "D\n";
    }
};


int main() {
    Base *myBase_raw = new Derived();
    delete myBase_raw;
    return 0;
}

你希望得到:

  

错误:'virtual Base :: ~Base()'在此上下文中受到保护delete myBase_raw;

这很好,是阻止人们删除对象的有用工具。 std::unique_ptr也是如此。但是当您将原始指针交换为std::shared_ptr时,它会正确编译:

int main() {
    std::shared_ptr<Base> myBaseS(new Derived());
}

似乎正在运行删除对象并调用BaseDerived析构函数(Live example)。根据{{​​3}}:

  

使用delete-expression或在构造期间提供给shared_ptr的自定义删除器来销毁对象。

由于我没有提供自定义删除功能,因此应调用delete。以上怎么可能?

0 个答案:

没有答案