Vector成員為指針時要注意的問題


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM