2017-05-16 38 views
-1

我有一個函數,我想將一些對象存儲到全局列表中。 這兩種方法都可以正常工作。但是他們是否都在堆上創建了一個變量? 他們之間有什麼區別?堆變量或不是| * new Object()||目的()?

vector.push_back(* new object()); 
vector.push_back(object()); 

TY求助

DrTosh

+1

的可能的複製[爲什麼C++程序員應儘量減少'new'的使用](http://stackoverflow.com/questions/6500313/why-should-c-programmers-minimize-use-of-new) –

+0

假設'vector'是一個' std :: vector ',第一次泄漏內存(由於動態分配一個永遠不會釋放的對象),第二次泄漏內存。兩者都會向矢量添加一個默認的構造對象或一個副本(假設相關的構造函數可以被適當地訪問和實現)。 – Peter

回答

1

兩個存儲它們的載體,載體本身是免費的在如何想要存儲它們,但通常使用免費商店。

有一個很大的區別,但:

vector.push_back(* new object()); 

這種動態分配的object對象,然後在矢量保存對象的副本,指針指向新分配object然後立即銷燬。

這種方式導致內存泄漏,因爲您沒有deleteobject您已分配new也不保存地址供以後使用。

vector.push_back(object()); 

這將創建一個臨時object被複制並存儲在向量,然後銷燬,這是將對象添加到您的載體的「正確」的方式。

+0

加一。這對我來說是正確的。 – Bathsheba

+0

在這兩種情況下,對象是否被創建並被複制? 有區別,* new object()不會被刪除,因爲它不是暫時的? – DrTosh

+0

@DrTosh正確。 –

1

new object()創建具有動態存儲持續時間匿名臨時變量。

* new object()會給你一個可怕的內存泄漏,因爲你不指針從new object()存儲,你只是解引用它,並將它傳遞給push_back

所以不要這樣做。

在另一方面,object()匿名臨時具有自動存儲持續時間。

4

這是錯誤的:

vector.push_back(* new object()); 

不要那樣做。您正在泄漏內存,因爲每個new都必須與delete匹配,您不會這麼稱呼。你可以做的最好的事情就是永遠不要致電new

這是OK:

vector.push_back(object()); 

但在C++ 11,你可以更容易地做到這一點:

vector.emplace_back(/*any constructor args go here*/); 
+1

加一個用於C++ 11方法。 – Bathsheba

+0

我不明白downvotes。我們都錯過了什麼? – Bathsheba

-1

它們類似於下面的代碼


object* temp = new object(); 
vector.push_back(*temp); 

object temp; 
vector.push_back(object); 

它無關vector,只是沒有delete被稱爲(你不能)

+0

爲什麼downvote? –

相關問題