在以下示例中:
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());
}
似乎正在运行删除对象并调用Base
和Derived
析构函数(Live example)。根据{{3}}:
使用delete-expression或在构造期间提供给shared_ptr的自定义删除器来销毁对象。
由于我没有提供自定义删除功能,因此应调用delete
。以上怎么可能?