您的位置:首页 > 其它

Vector成员为指针时要注意的问题

2015-06-27 22:54 246 查看
vector的复制是浅复制,所以复制一个包含动态内存的变量的对象的话就会出问题.
解决办法:自己写类的复制构造函数,为新对象的指针开辟新的内存空间。
但当vector离开作用域之后,只会把其成员所占的内存删除(即指针),而不会删除指针指向的内存,就会出现内存泄露。
解决办法:使用智能指针。

#include <iostream>
#include <memory>
#include <vector>
using namespace std;

class A {
public:
~A(){
cout<<"delete"<<endl;
}
};

void main()
{
vector<auto_ptr<A> > tmp;
tmp.push_back(auto_ptr<A>(new A()));
tmp.push_back(auto_ptr<A>(new A()));
}


输出结果:

a delete

a delete

通过输出结果可知,tmp在结束生命周期的时候,智能指针会把其作用指针所指向的内存释放。

#include <iostream>
#include <memory>
#include <vector>
using namespace std;

class A {
public:
~A(){
cout<<"delete"<<endl;
}
};

void main()
{
vector<A*> tmp;
tmp.push_back(new A());
delete tmp[0];
}


若然没有最后的 delete tmp[0]
程序是不会输出 a delete,因为vector只delete了指针(A*是元素类型),而没有删除指针指向的内容,造成内存泄露。
程序结束会直接把整个vector所占的内存回收掉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: