有時我在不同的C++程序看,對象聲明和使用像這樣:指針分配與正常申報
object *obj = new object;
obj->action();
obj->moreAction();
//etc...
是否有這樣做的任何好處,而不是簡單地做:
object obj;
obj.action();
obj.moreAction();
//etc
有時我在不同的C++程序看,對象聲明和使用像這樣:指針分配與正常申報
object *obj = new object;
obj->action();
obj->moreAction();
//etc...
是否有這樣做的任何好處,而不是簡單地做:
object obj;
obj.action();
obj.moreAction();
//etc
是的 - 您可以將指針存儲在容器中或從函數返回,並且指針超出範圍時對象不會被銷燬。指針被用來
這並不是免費的午餐 - 您需要手動銷燬對象(delete
)當你不再需要它,當這一刻來決定並不總是很容易,再加上你可能只是忘了代碼時。
基本上,如果你想要一個對象活過你在創建它的範圍的壽命應該只使用「新的」如:
X* g(int i) { /* ... */ return new X(i); } // the X outlives the call of g()
如果你想要一個對象住在僅有的範圍,不要使用「新」,而是簡單地定義一個變量:
{
ClassName x;
// use x
}
它歸結爲有過問題的對象的生命週期更多的控制權(使用new
時)。
第一種形式,在堆中分配對象,爲您提供全面控制(和全責任)的對象的生存時間:你要刪除obj
明確。
在第二種形式中,當obj
超出得分(離開當前代碼塊時)時,該對象會自動且不可撤銷地被銷燬。
另一個沒有人提到的原因。
堆棧通常爲1Mb,因此必須在堆上創建大對象(使用新的)
在我的vanilla Ubuntu 9.04上8 MB(這實際上證明了你的觀點而不是與之相矛盾) – digitalarbeiter 2010-02-17 16:20:11
是的,有一個很好的理由:當使用後一種形式時,您有更多機會擁有正確的程序。
問題是前面的表單(指針)是C
主義,在C++
中,您應該使用智能指針來確保對象在其壽命結束時被正確銷燬。
現在,如果你使用std::auto_ptr<Object> obj(new Object());
你有3個好處:
一個可以問一個相反的方式風險較小:什麼時候應該使用奇怪第一選擇?基本上如果你想分配大對象,因爲如果你不必這樣做,並且你可以把它放在堆棧上,它將會快得多:這是使用C++而不是JAVA的主要優勢之一,它將所有對象在堆上。當處理許多小對象的分配時,這個好處是特別真實的:將它們放在堆棧上以提高速度。解引用指針會產生開銷。你可以找到here有關boost pool library的信息,它爲我們提供了管理這種分配的工具。
你幾乎提到過它,但值得指出的是第二幀是在堆棧上創建的。 – Patrick 2010-02-17 15:47:00