2016-10-07 22 views
1

我聲明瞭矢量:可用內存

vector<Object> my_vect; 

,我推一些對象到它像

my_vect.push_back(*(new Object())); 

我知道這將是簡單如果我要聲明一個指針向量,但這對我的代碼至關重要。

我嘗試使用

my_vect.clear() 

,但無濟於事。

此外,我也嘗試過讓指針的對象,如:

vector<*Object> new_my_vect; 

for(int i = 0; i < my_vect.size(); i++) 
{ 
    new_my_vect.push_back(&my_vect[i]); 
} 

for(int i = 0; i < new_my_vect.size(); i++) 
{ 
    delete new_my_vect[i]; 
} 

但我得到一個「free(): invalid pointer:」的錯誤。

感謝信,

+2

爲什麼你認爲你需要'new'在這裏創建的對象:'my_vect。 push_back(*(new Object()));'實際上? –

+0

我剛剛使用my_vect.push_back(Object())。我是C++新手,所以我不太確定對象是否需要存儲在堆中。所以只是一個後續問題:即使我使用超出範圍的對象(通過將其存儲在向量中),爲什麼它工作正常?它不會被其他東西覆蓋在堆棧上嗎? –

回答

1

你應該對象添加如下

vector<Object> my_vect; 

my_vect.emplace_back(); 

my_vect.push_back(Object()); 

我不會建議讓指針與載體內的對象,如果有的話導致向量重新分配這些指針將被無效,因爲底層數組將被複制到別處。

+0

或'vector my_vect(n);'。 –

+0

非常感謝您的回答。我結束了使用my_vect.push_back(Object())。我是C++新手,所以我不太確定對象是否需要存儲在堆中。所以只是一個後續問題:即使我使用超出範圍的對象(通過將其存儲在向量中),爲什麼它工作正常?它不會被其他東西覆蓋在堆棧上嗎? –

1

*(新對象())

這是內存泄漏。它在堆上創建一個新對象,取消引用它,創建一個副本(除非vector :: push_back使用移動語義),然後泄漏由堆分配保留的內存。

vector < * Object> new_my_vect;

對(INT I = 0;我< my_vect.size();我++){ new_my_vect.push_back(& my_vect [I]); }

對(INT I = 0;我< new_my_vect.size();我++){ 刪除 new_my_vect [I]; }

這是取對象存儲在向量本身的地址。這絕對保證不會與您傳入向量中的對象的地址相同。矢量可以隨意重新分配和重新排列它的內部記憶。只要您不修改矢量,只需要向量中的某個對象的地址即可。使用刪除釋放此內存是無效的。

這裏的全部問題是,您正在向量中存儲對象的值,而不是地址。改爲存儲指針。這樣你可以添加堆分配的對象,然後循環遍歷矢量並在完成時釋放它們。這樣它只會複製指針,而不是對象。

vector<Object*> objs; 
for (int i = 0 ; i < 10 ; ++i) { 
    objs.push_back(new Object()); 
} 
for (unsigned int i = 0 ; i < vec.size() ; ++i) { 
    delete objs[i]; 
} 
+0

感謝您的回答。現在非常清楚。對不起,不能upvote(我沒有足夠的代表哈哈)。 –

1

這樣做

my_vect.push_back(*(new Object())); 

導致這些:在堆上創建

  1. 物體的物體。

  2. 對象的指針被取消引用*(..)並作爲push_back中的參數傳遞。

  3. 此對象的副本在存儲在向量中時創建。

  4. 只要push_back返回,最初創建的對象仍然被分配,沒有人能夠釋放它,因爲它的指針保持不了任何狀態。所以產生了內存泄漏。

如前所述,如果你需要「對象」對象的載體,你可以通過堆棧

my_vect.push_back(Object()); 
+0

感謝您的回答。現在非常清楚。對不起,不能upvote(我沒有足夠的代表哈哈)。 –