实验
定义一个基类和一个派生类
class Base
{
public:
virtual ~Base() = default;
};
class Derive :
public Base
{
public:
std::shared_ptr<int> sp{
new int{0},
[](int *p)
{
delete p;
std::cout << "删除器" << endl;
},
};
};
main 函数执行如下代码
Base *p = new Derive{};
delete p;
输出结果如下
如果删除基类的虚析构,如下
class Base
{
public:
// virtual ~Base() = default;
};
class Derive :
public Base
{
public:
std::shared_ptr<int> sp{
new int{0},
[](int *p)
{
delete p;
std::cout << "删除器" << endl;
},
};
};
再次执行,输出结果如下
没有任何输出。这说明智能指针的删除器没有执行,进而说明智能指针的析构函数没有被调用。所以,基类一定要有虚析构。
结论
C++ 一个类,如果不是 final ,就一定要定义虚析构,否则被继承后就有发生内存泄漏的风险。不定义虚析构的类一定要标记为 final,明确阻止继承。