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

Fan*_*Fox 8 c++ pointers c++11

在以下示例中:

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;
}
Run Code Online (Sandbox Code Playgroud)

你期望得到:

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

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

int main() {
    std::shared_ptr<Base> myBaseS(new Derived());
}
Run Code Online (Sandbox Code Playgroud)

似乎运行删除对象并调用BaseDerived析构函数(实例).根据cppreference:

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

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