2010-04-17 99 views
0

我有一些麻煩,找到最好的方式來完成我想到的,因爲我的經驗不足。我有一個課,我需要一個對象的矢量。所以我的第一個問題是:C++容器上的類,返回指針

  • 是有這個有什麼問題:矢量< ANYTYPE>容器*,然後構造新的(並刪除它的析構函數)初始化呢?

另一個問題是:如果此向量是要存儲對象,應該不是更像矢量< AnyTipe *>,使他們可以動態創建?在那種情況下,我將如何返回一個方法中的對象,以及如何避免內存泄漏(試圖僅使用STL)?

回答

1

是的,你可以做vector<AnyType> *container和新/刪除它。當你使用下標符號來訪問它的元素時要小心;一定要說(*container)[i],而不是container[i],或更糟的是,*container[i],這可能會編譯並導致崩潰。

當您執行vector<AnyType>時,會根據需要自動調用構造函數/析構函數。但是,如果您打算傳遞對象,則此方法可能會導致不需要的對象複製。雖然vector<AnyType>適用於最明顯的操作,但是我建議使用vector<AnyType*>,因爲它非常靈活。

+0

謝謝。但是,如果我有向量< AnyType* >,我想返回一個元素,我必須做一些事情,如使用AnyType複製構造函數返回新的AnyType(..)?我相信我不能直接從vector中直接返回元素嗎? – dmessf 2010-04-17 02:13:02

+0

該向量包含指針,這些是元素。只要保持有效,您就可以使用指針。如果指針指向一個動態分配的對象,那麼它將一直保持有效,直到有人將其刪除,即某人爲你。因此,如果您打算在調用者完成使用前刪除對象,則需要返回對象的副本(或使用引用計數)。如果你正在複製,你通常會比使用'new'創建一個副本並返回一個指針更好。 C++根本不是Java。 – 2010-04-17 02:21:47

1

不要使用新的和刪除任何東西。

有時你必須,但通常你不這樣做,所以儘量避免它,看看你如何繼續。很難確切地解釋如何沒有更具體的例子,但特別是如果你正在做的:

SomeType *myobject = new SomeType(); 
... use myobject for something ... 
delete myobject; 
return; 

那麼首先這個代碼是泄漏頻發,其次它應改爲:

SomeType myobject; 
... use myobject for something (replacing -> with . etc.) ... 
return; 

特別是不要用新建立一個向量 - 這幾乎總是錯誤的,因爲在實踐中,向量幾乎總是有一個明確定義的所有者。該所有者應該有一個向量變量,而不是它們必須記住要刪除的指針向量。你不會動態地分配一個int只是作爲一個循環計數器,並且你不會動態地分配一個矢量來保存一些值。在C++中,所有類型都可以像內置類型一樣在很多方面表現出來。這些問題是你希望他們擁有的一生,以及(有時)按價值傳遞或複製它們是否昂貴。

它不應該是更像矢量< AnyTipe *>所以他們可以動態創建?

只有當他們需要動態創建出於其他原因,除了你想要在矢量中組織它們。在你遇到這個原因之前,不要找一個。

在這種情況下,我將如何從一個方法返回一個對象,以及如何避免內存泄漏(試圖只使用STL)?

標準庫並不真正提供工具來避免所有常見情況下的內存泄漏。如果你必須管理內存,我向你保證,實現shared_ptr的努力要比沒有一個更好。

1

是有具有該問題的任何:矢量< ANYTYPE> *容器中,然後在構造與新的(和刪除它的析構函數)初始化

否存在不是問題。但基於此,也不需要動態分配矢量。

只需使載體中的類的成員:

class foo 
{ 
    std::vector<AnyType> container; 
    ... 
} 

容器將被自動構造/與foo的實例破壞沿。既然這是你完全描述你想要做的事情,那就讓編譯器爲你完成工作。