Vector成员为指针时要注意的问题
2015-06-27 22:54
246 查看
vector的复制是浅复制,所以复制一个包含动态内存的变量的对象的话就会出问题.
解决办法:自己写类的复制构造函数,为新对象的指针开辟新的内存空间。
但当vector离开作用域之后,只会把其成员所占的内存删除(即指针),而不会删除指针指向的内存,就会出现内存泄露。
解决办法:使用智能指针。
输出结果:
a delete
a delete
通过输出结果可知,tmp在结束生命周期的时候,智能指针会把其作用指针所指向的内存释放。
若然没有最后的 delete tmp[0]
程序是不会输出 a delete,因为vector只delete了指针(A*是元素类型),而没有删除指针指向的内容,造成内存泄露。
程序结束会直接把整个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所占的内存回收掉。
相关文章推荐
- php页面静态化—动态页面和静态页面
- Linux下NFS详解
- mysql触发器解决购物中订单爆仓问题
- SelectSort
- Intent的六大属性
- SecureCRT连接Ubuntu失败(远程系统拒绝访问)
- 数组转模型
- 添加修改sa用户(数据库授权总结)
- Intent的六大属性
- JAVA数字大写金额转换
- Java中的Enum枚举类型总结
- 续评《遇到一位ITer,一位出租车司机,必看》
- 猜数
- 简易Java Bean转JSON
- 查找二叉树最远两个节点的距离
- 滑动到点击位置的ListView
- [USACO Jan07]考试Schul解题报告
- Qsort
- 2015第26周六《谁动了我的奶酪》书摘
- 关于scrollTop值一直为0的问题