容器元素增删内存变化浅析
前言
STL的容器模板类在添加元素的时候,采用拷贝构造,并且是浅拷贝,而不是直接传递指针,这意味这系统要多开辟一块内存来满足容器的使用。如果要正确使用STL容器对各种对象操作要注意重载拷贝构造函数,也就是变成深拷贝。
使用细节
测试代码使用到了vector向量,而每次他都调用当前元素相应个数的析构以及拷贝构造。这其中的原因是vector初始化大小为1,然后每次添加元素进去它都会改变大小来满足元素个数的需要,而当添加到第三个的时候它大小直接开辟两个,后面变为4个(如例输出)。这就和数据结构中顺序表具体操作有关,大胆猜测一下这个大小当到达某个阈值时就会线性增加,而不会翻倍
测试代码
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
class STL_Test{
public:
char *str;
public:
STL_Test():str(NULL){
cout << "构造函数调用" << endl;
}
STL_Test(const STL_Test &cd)
{
cout << "拷贝函数调用 " << endl;
this->str = new char[strlen(cd.str)+1];
strcpy(str, cd.str);
}
~STL_Test(){
if(str){
cout << "析构函数调用,str不为null" << endl;
delete[] str;
}else {
cout << "析构函数" << endl;
}
}
};
int main()
{
vector <STL_Test> a2;// = new vector <STL_Test>();
vector <STL_Test> *a1 = &a2;
a1 -> reserve(1);
cout << "容器大小: " << a1 -> capacity() << endl;
STL_Test d1;
d1.str = new char[32];
strcpy(d1.str, "copy1");
cout << "---------------------------------" << endl;
a1->push_back(d1);
cout << "---------------------------------" << endl;
STL_Test d2;
d2.str = new char[32];
strcpy(d2.str, "copy2");
cout << "---------------------------------" << endl;
cout << a1 <<endl;
a1->push_back(d2);
cout << "容器大小: " << a1 -> capacity() << endl;
cout << a1 <<endl;
cout << "---------------------------------" << endl;
STL_Test d3;
d3.str = new char[32];
strcpy(d3.str, "copy3");
cout << "---------------------------------" << endl;
cout << a1 <<endl;
(*a1).push_back(d3);
cout << "容器大小: " << a1 -> capacity() << endl;
cout << a1 <<endl;
cout << "---------------------------------" << endl;
STL_Test d4;
d4.str = new char[32];
strcpy(d4.str, "copy4");
cout << "---------------------------------" << endl;
cout << a1 <<endl;
a2.push_back(d4);
a2.push_back(d4);
cout << "容器大小: " << a2.capacity() << endl;
cout << a1 <<endl;
cout << "---------------------------------" << endl;
// delete a1;这里删除a2栈内存空间,让程序不能正常结束
return 0;
}