2012-12-18 75 views
2

可能重複:
What is difference between instantiating an object using new vs. without
Creating an object: with or without `new`對象的構造語法

是什麼這兩個語句

HttpUtil httpUtil; 

之間的區別
HttpUtil *net = new HttpUtil(); 

哪一個更好用?

+1

第一個分配在堆棧上,另一個分配在堆上,程序員有責任在使用後釋放它(當它在堆上分配時)。當你可以沒有第二個,更喜歡第一個:) – Maroun

+1

請從[這裏](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)得到一個初學者的書。 – pmr

回答

2

第一條語句在'堆棧'上創建一個名爲httpUtil的變量 - 這意味着只要包含該行的函數結束,變量就會'超出範圍'並被釋放(它使用的內存將變爲空閒用於其他的東西)。

第二條語句在'堆'上創建一個變量 - 這意味着變量將保留在內存中,直到您調用delete爲止。在堆中分配變量時,需要確保始終使用delete,否則會發生內存泄漏 - 這是您無法再看到變量*net的地方,但內存仍在分配中。

4

第一個創建一個自動變量。內存管理是自動的,因爲它在堆棧上的分配速度更快,所以不會有內存泄漏的機會。

第二個版本創建一個動態變量 - 您負責清理內存,並且分配在堆上更慢。

總是比較喜歡第一個。如果您必須使用動態分配(用於持久化生存期或多態行爲),請使用智能指針而不是原始指針。

+0

所以我可以訪問'*網絡,即使當我實例化它的功能完成? – Tahlil

+0

@kalkin取決於你如何返回它。 –

+0

就像我將它作爲指針返回一樣? – Tahlil

1

第一個是靜態創建的對象,你不需要擔心它的破壞。 後來一個是動態創建的對象,您需要在應用程序終止之前處理它的銷燬。

第一個是你不需要擔心內存管理的首選。