Core List
1. 局部销毁对象问题
class Base {
public:
Base();
~Base(); // 基类包含析构函数
}
Base *ptr = getDerivedClass();
delete ptr;
注:
(1) getDerivedClass()将返回一个 derived class 的对象;
(2) 因基类存在析构函数,在 delete 操作回收空间前将调用此基类的析构函数。(派生类成分无法销毁)// 错误
(3) 若基类的析构函数为 virtual ,则 delete 调用的析构函数则为派生类的析构函数,可以释放全部内存空间。// 正确
(4) 任何 class 只要带有 virtual 函数都几乎确定应该也有一个 virtual 析构函数。
PS:delete 和 delete[] 的区别
T *ptr = new T[10];
delete ptr;
delete[] ptr;
注:
delete : 回收空间前,先调用对象的析构函数,再回收空间;对于数组对象,仅调用 ptr[0] 对象的析构函数,ptr[1],ptr[2] 等对象的析构函数不被调用
delete[] :回收空间前,调用数组中全部对象的析构函授,再回收空间
若T为基本类型,无析构函数,则 delete 和 delete[] 则无区别, 但对于类对象,则不可混淆使用。
2. 非基类包含 virtual 函数的问题
类如果包含虚函数,则必须包含虚函数表,且对象将包含一个vptr来指向这个虚函数表,即对象大小将增加。
PS:虚函数表问题
http://blog.youkuaiyun.com/haoel/article/details/1948051/
注:
(1) 只有当 class 内含至少一个 virtual 函数, 才为它声明 virtual 析构函数
3. virtual 析构函数和基类问题
(1) 包含 non-virtual 析构函数的类作为基类,将导致 “局部销毁”问题
(2) 使用纯虚析构函数,创建抽象类。
a. 虽然纯虚函数一般在基类中不提供定义, 但是必须为纯虚析构函数提供定义.
b. 因析构函数的调用过程是从最深层的派生类析构函数开始调用,直到基类的析构函数.