2013-03-06 103 views
0

我有幾個關於內存管理如何爲矢量工作的問題/示例。C++內存管理對象矢量

vector<int> vec1(10); 
    vector<int> vec2(10);   
    vec1 = vec2; 

在這種情況下,vec1的舊內存現在無法訪問。它仍然是一個內存泄漏嗎?或者vec2的舊內存會意識到沒有任何引用它並得到清理?

在另一示例

struct foo 
{ 
    vector<int> foo_vec(50); 
    int* arr; 
} 


void myFunction() 
{ 
    vector<foo> vec(10); 
    vec[0].arr = new int[50]; 
    vec.erase(vec.begin()); 
} 

由於我其含有與所分配的存儲器ARR第一矢量元件上使用的erase(),確實erase()釋放該存儲器或是否需要將其釋放擦除手動之前?另外當vec超出範圍,vec中的所有foo_vec載體自動清理?謝謝你的幫助。

回答

2

自從int VEC 1的以前的內容被刪除的

vector<int> vec1(10); 
vector<int> vec2(10);   
vec1 = vec2; 

的情況下只是一個POD。如果vector包括指針的對象,而不是整數,並且這些用new分配,你將不得不刪除的內容這些指針指向分配之前,否則你最終會與內存泄漏,你的第二個例子顯示:

vector<foo> vec(10); 
vec[0].arr = new int[50]; 
vec.erase(vec.begin()); // this will *not* call delete on vec[0].arr 

通常情況下,爲了讓自己的事情變得簡單,你需要使用智能指針,如獨特的指針(或者eg提高:: shared_array/scoped_array)。當矢量超出範圍或刪除矢量時,將自動調用刪除(或刪除[])。

struct foo 
{ 
    std::vector<int> foo_vec(50); 
    std::unique_ptr<int[]> arr; 
} 
... 
vec[0].arr.reset(new int[50]); 
vec[0].arr[12] = 42; 
... 
vec.erase(vec.begin()); // this will call delete[] on vec[0].arr 
+0

如果'vec1'和'vec2'包含結構呢?那麼會有內存泄漏嗎? – locke14 2014-04-04 07:52:05

+0

這取決於。當你把東西放入矢量中時,你需要決定誰擁有這些實例。 – 2014-04-04 21:46:40

1
  1. 當然它會被清理。
  2. 不,如果destructorfoo沒有這樣做(或者如果您在擦除之前沒有手動執行此操作)。
2

是否擦除()釋放該內存或我需要在擦除之前手動釋放它?

規則:每個new總是使用deletevector不是沒有魔力 - 它不知道你是如何獲得該指針的,所以它不會刪除它,你需要這樣做。

另外,當vec超出範圍,vec中的所有foo_vec向量是否自動清理?

是的,他們的析構函數被調用,他們被釋放。但是,如果析構函數不是delete[] arr;,則會泄漏內存。


順便提一下,一條好建議:你的代碼違反了封裝。您應該分別分配(new)和免費(delete[]foo::arr指向的內存在析構函數和構造函數(foo::foo()foo::~foo())中。

最後,強制性提問:爲什麼foo::arr不是vector<int>本身?

+0

哦,這些只是我編造的例子,以幫助我更好地理解,而不是我正在編寫的實際代碼。 – roverred 2013-03-06 07:27:32