2010-02-17 44 views
4

有時我在不同的C++程序看,對象聲明和使用像這樣:指針分配與正常申報

object *obj = new object; 
obj->action(); 
obj->moreAction(); 
//etc... 

是否有這樣做的任何好處,而不是簡單地做:

object obj; 
obj.action(); 
obj.moreAction(); 
//etc 

回答

5

是的 - 您可以將指針存儲在容器中或從函數返回,並且指針超出範圍時對象不會被銷燬。指針被用來

  • 避免對象的不必要的複製,
  • 便於可選對象創建,用於創建複雜的圖形樣結構
  • 定製對象生存期管理,
  • 爲以上的組合。

這並不是免費的午餐 - 您需要手動銷燬對象(delete)當你不再需要它,當這一刻來決定並不總是很容易,再加上你可能只是忘了代碼時。

1

基本上,如果你想要一個對象活過你在創建它的範圍的壽命應該只使用「新的」如:

X* g(int i) { /* ... */ return new X(i); } // the X outlives the call of g()

如果你想要一個對象住在僅有的範圍,不要使用「新」,而是簡單地定義一個變量:

{ 
    ClassName x; 
    // use x 
} 
0

它歸結爲有過問題的對象的生命週期更多的控制權(使用new時)。

3

第一種形式,在堆中分配對象,爲您提供全面控制(和全責任)的對象的生存時間:你要刪除obj明確。

在第二種形式中,當obj超出得分(離開當前代碼塊時)時,該對象會自動且不可撤銷地被銷燬。

+0

你幾乎提到過它,但值得指出的是第二幀是在堆棧上創建的。 – Patrick 2010-02-17 15:47:00

2

另一個沒有人提到的原因。
堆棧通常爲1Mb,因此必須在堆上創建大對象(使用新的)

+0

在我的vanilla Ubuntu 9.04上8 MB(這實際上證明了你的觀點而不是與之相矛盾) – digitalarbeiter 2010-02-17 16:20:11

0

是的,有一個很好的理由:當使用後一種形式時,您有更多機會擁有正確的程序。

問題是前面的表單(指針)是C主義,在C++中,您應該使用智能指針來確保對象在其壽命結束時被正確銷燬。

現在,如果你使用std::auto_ptr<Object> obj(new Object());你有3個好處:

  1. 你現在明確管理對象的生命週期(但不能忘記它)
  2. 你可以存儲你的對象與多態性的容器
  3. 你不堵塞棧,從而在運行到一個堆棧溢出
0

一個可以問一個相反的方式風險較小:什麼時候應該使用奇怪第一選擇?基本上如果你想分配大對象,因爲如果你不必這樣做,並且你可以把它放在堆棧上,它將會快得多:這是使用C++而不是JAVA的主要優勢之一,它將所有對象在堆上。當處理許多小對象的分配時,這個好處是特別真實的:將它們放在堆棧上以提高速度。解引用指針會產生開銷。你可以找到here有關boost pool library的信息,它爲我們提供了管理這種分配的工具。