1、如果一个class中包含一个vector容器,那么sizeof(class_name)的值应该怎么算?
#include <iostream>
#include <vector>
using namespace std;
class CDocument{
public:
int i;
vector<long long> vec;
};
int main(){
CDocument mydoc;
cout << sizeof(mydoc.vec) << endl; //12
cout << sizeof(CDocument) << endl; //16,即12+4
for(int i = 1; i <= 5; i++)
mydoc.vec.push_back(i);
cout << sizeof(CDocument) << endl; //16
cout << sizeof(mydoc) << endl; //16
}
题目中所描述的是C++类与类关系的一种:叫做Composition(复合),所以在计算sizeof(class_name)的值时,只需要将复合的类展开,展开以后再按照传统的计算单个类的sizeof(class_name)去进行计算就可以了。
图示如下:
2、复合关系的构造和析构顺序
关于复合关系,我们还需要明白的是,对象的构造和析构的过程中两个类的构造函数和析构函数的先后顺序是什么样子的,其实就和继承时构造和析构的顺序类似,见图:
注意图中红字的部分是编译器来帮我们做的。
3、复合关系的内存回收
所以当我们在一个class A中放置了一个容器(假设vector<int> vec)时,当我们使用A创建了一个对象obj,并且有一个指针ptr指向了obj,此时delete ptr,就会调用A的析构函数,而此时编译器也帮助我们去调用容器的析构函数,来完成整个内存的回收,这个过程并不需要我们人为的使用vec.clear()来回收vector的内存。