初次接触vector的同学可能会因为方便而放弃使用new/delete、malloc/free等动态内存申请方式,当需要用到一个不确定空间大小的变量时,可以直接定义
vector<int> vecINum;
vector<vector<char>> vecCName;
vector<MyClass> vecMC;
然后通过push_back/pop_back等操作动态增加数据。
然而使用过程中如果涉及到动态内存申请,就需要注意以下的情况:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<char*> vec_c;
for(int i = 0; i < 2; i++)
{
char* ch = new char(5);
strcpy(ch, "haha");
vec_c.push_back(ch);
delete ch;
}
cout<<vec_c[0]<<endl;//错误,内存已释放
return 0;
}
如上,当指针变量ch在一次循环后通过delete得到释放,vec_c中存储的指针所指向的内存区域也就释放了。正确做法是将delete ch;这句去掉,然后释放的任务交给vector来完成(vec_c.clear())。
当类中存在动态申请内存的成员变量时:
#include <iostream>
#include <vector>
using namespace std;
class MyClass
{
public:
MyClass()
{
p = NULL;
}
/*MyClass(const MyClass& mc)
<span style="white-space:pre"> </span>{
strLength = mc.strLength;//注意类内直接访问私有成员变量,编译通过
char* temp = new char(strLength);
p = temp;
<span style="white-space:pre"> </span>}*/
void SetSpace(int num)
{
p = new char(num);
strLength = num;
}
char* GetStr()
{
return p;
}
int GetStrLength()
{
return strLength;
}
~MyClass()
{
if(p)
delete p;
}
private:
char* p;
int strLength;
};
int main()
{
vector<MyClass> vecMC;
for(int i = 0; i < 2; i++)
{
MyClass mc;
mc.SetSpace(5);
vecMC.push_back(mc);
}
return 0;
}
当程序执行到vecMC.push_back(mc);时会自动调用拷贝构造函数,如果没有则调用默认拷贝构造函数,实现的是浅拷贝,也就是说当当前循环执行结束后,mc中的指针p所指向的内存会释放,因此程序会报错。若想实现该程序的功能就必须重写拷
贝构造函数MyClass(const MyClass& mc),即程序中注释的部分,来实现深拷贝。同样,释放的任务交给vector来完成。