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所占的內存回收掉。