vector的复制是浅复制,所以复制一个包含动态内存的变量的对象的话就会出问题.
解决办法:自己写类的复制构造函数,为新对象的指针开辟新的内存空间。
但当vector离开作用域之后,只会把其成员所占的内存删除(即指针),而不会删除指针指向的内存,就会出现内存泄露。
解决办法:使用智能指针。
1 #include <iostream> 2 #include <memory> 3 #include <vector> 4 using namespace std; 5 6 class A { 7 public: 8 ~A(){ 9 cout<<"delete"<<endl; 10 } 11 }; 12 13 void main() 14 { 15 vector<auto_ptr<A> > tmp; 16 tmp.push_back(auto_ptr<A>(new A())); 17 tmp.push_back(auto_ptr<A>(new A())); 18 }
输出结果:
a delete
a delete
通过输出结果可知,tmp在结束生命周期的时候,智能指针会把其作用指针所指向的内存释放。
1 #include <iostream> 2 #include <memory> 3 #include <vector> 4 using namespace std; 5 6 class A { 7 public: 8 ~A(){ 9 cout<<"delete"<<endl; 10 } 11 }; 12 13 void main() 14 { 15 vector<A*> tmp; 16 tmp.push_back(new A()); 17 delete tmp[0]; 18 }
若然没有最后的 delete tmp[0]
程序是不会输出 a delete,因为vector只delete了指针(A*是元素类型),而没有删除指针指向的内容,造成内存泄露。
程序结束会直接把整个vector所占的内存回收掉。