接上篇,这次代码为:
#include <vector>
#include <iostream>#include <string>
using namespace std;
class human
{
protected:
string _name;
public:
human()
{
};
~human()
{
cout << _name << endl;
};
string getName() {return _name;};
void setName(string aName) {_name = aName;};
};
class man : public human
{
};
int main()
{
vector<man> daddys;
//cout << daddys.capacity() << endl
man daddy2; daddy2.setName("daddy2");
daddys.push_back(daddy1);
//cout << daddys.capacity() << endl;
daddys.push_back(daddy2);
//cout << daddys.capacity() << endl;
daddys[0].setName("daddy3");
daddys[1].setName("daddy4");
return 1;
}
输出结果:
daddy1
daddy2
daddy1
daddy3
daddy4
很奇怪的输出结果,首先创建了daddy1,daddy2,然后将它们放入daddys,为什么
程序结束后显示调用了5次析构函数呢?而且daddy1调用了2次。
其原因为vector的增长方式,创建daddys的capacity为0,然后程序创建了daddy1与daddy2,
接着将daddy1 push_back 进入daddys,此时,daddys 的capacity为1。
而后将daddy2 push_back 进入daddys时,daddys的capacity 不够了,于是编译器先是把开辟了
一块capacity为2的内存,然后把原来的daddys 拷贝过来,然后把这块新的内存变为daddys,并释放
掉原来的内存,在这个过程中 调用了一次析构函数,之后才将daddy2,放入daddys,最后程序结束前
自动调用4次析构函数。其过程如下:
1. 创建daddys, 此时capacity=0
2. 创建daddy1与daddy2
3. daddys 的capacity增长为1
4. 将daddy1放入daddys
5. 开辟新内存 mem其capacity=2
6. 将daddys的内容拷贝至mem
7. 释放daddys,此处调用一次析构函数
8. 将mem标记为daddys,此时daddys的capacity增长为2
9. 将daddy2放入daddys
10.程序结束调用4次析构函数
所以以上代码总共调用了5次析构函数。