《Effective C++》读书笔记
之前看过一遍,不过草草了事。近日看了《深度探索C++对象模型》,想起《Effective C++》中的内容已经有些忘记了,所以重新温习一下。这篇笔记只挑选书中的一些重要内容进行记录。
条款07:为多态基类声明virtual析构函数
这一个条款几乎是面试中的高频问题,只需要回答,如果不将基类中的析构函数声明为虚函数,那么当我们通过基类指针删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数,这样就会导致派生类中的资源无法释放,即“局部销毁”,造成内存泄漏。可是,为什么会这样呢?以及为什么将析构函数声明为虚函数就可以解决这个问题呢?
让我们结合《深度探索C++对象模型》中的内容来解释这个问题。-我们知道C++通过虚拟机制实现多态,而在表现上,多态就是“以一个public base class的指针或者引用寻指出一个derived class object”的意思,因此通过基类指针
下面是示例代码:
#include <cstdlib>
#include <iostream>
class Base {
public:
Base() {
_base_data = static_cast<char*>(malloc(100));
std::cout << "Base constructor" << std::endl;
}
virtual ~Base() {
free(_base_data);
_base_data = nullptr;
std::cout << "Base destructor" << std::endl;
}
private:
char* _base_data;
};
class Derived : public Base {
public:
Derived() {
_derived_data = static_cast<char*>(malloc(100));
std::cout << "Derived constructor" << std::endl;
}
virtual ~Derived() override {
free(_derived_data);
_derived_data = nullptr;
std::cout << "Derived destructor" << std::endl;
}
private:
char* _derived_data;
};
int main() {
Base* base{new Derived()};
delete base;
return 0;
}
标签:函数,Effective,读书笔记,C++,析构,基类
From: https://www.cnblogs.com/tianshihao/p/18148854