簡體   English   中英

帶有或不帶有“ new”的c ++類應該使用什么?

[英]what should i use with a c++ class, with or without “new”?

我什么時候應該使用指針,什么時候不使用? 有什么更好的方法? 我必須在程序末尾刪除指針的cat對象嗎?

例:

cat piki;
piki.miao();
cat *piki2 = new cat();
piki2->miao();

盡可能避免使用new對象(即在堆上)創建對象,因為您必須自己進行內存管理(或者至少需要使用智能指針)。 如果在堆棧上分配對象(即cat piki; ),則當piki超出范圍時,將自動釋放為cat對象分配的內存。 使用piki2不會發生這種情況,您需要delete piki2; 釋放內存。

創建帶有或不帶有新對象的對象取決於您使用對象的位置。 如果在函數或塊中使用類的對象,則可以在不使用新對象的情況下創建該對象,以便一旦對象超出范圍,析構函數就會自動被調用。

如果要在多種方法中使用對象,或者要從函數返回對象,則需要使用new創建對象,並確保正確刪除它。

要回答“ 我必須在程序末尾刪除指針的cat對象嗎? ”,但在其他答案中卻沒有看到:
從程序上講,從技術上講,程序結束時,通常不需要刪除(也請參閱Tony的說明),因為大多數操作系統會在您執行清理操作后刪除使用new分配的對象。 (注意“最”,MsDos(我不知道哪個版本)是一個沒有發生的示例,因此在運行這些程序時必須重新啟動。
但是,不刪除已更新的內容是不正確的做法,因為程序會不斷增長,並且之前“可以接受的”內容可能突然導致內存泄漏,並可能導致系統不穩定。

可能無法刪除的示例(我不建議您在這種情況下不關心):

  • 使用Singletons時,要避免析構函數中的依賴性問題。
  • 在多線程系統中,某些擁有任何資源的線程可能會暫停而不進行清理。

當然,在簡單的情況下,最好按照其他答案中的建議分配沒有新的資源。

當當前范圍關閉時, piki對象將被自動刪除。

必須顯式刪除piki2

delete piki2;

這純粹是針對您的要求。 直接使用對象的原因之一是,如果您知道需要多少個對象。 但是,如果不確定要創建多少個對象,則可以在每次需要創建一個運算符時使用new運算符來創建對象。

但是,如果您像使用完一樣使用指針

cat *piki2 - new cat();

然后,正如您已經提到的,一旦指針使用結束,您需要刪除它。

delete piki2;
cat *piki2 = new cat();
piki2->miao();

這是幾種失敗形式。 例如,如果苗條拋出異常怎么辦? 您應該始終為資源使用自釋放指針。 使用new運算符創建的對象創建起來很慢,訪問和管理起來也很慢,再加上額外的內存開銷,因此,您實際上應該盡可能使用第一種形式。

盡可能使用智能指針。 使用boost智能指針庫。

http://www.boost.org/doc/libs/1_44_0/libs/smart_ptr/smart_ptr.htm

正如Developer Art所說,您可以撰寫有關此主題的書。 尤其是如果您按要求列出啟發式列表。

但是,一些規則將大有幫助。

要考慮的一個因素是不會對cat的堆棧分配實例進行多態處理。 對於要多態樹化的對象,必須用指針或引用表示。

任何不再需要的對象都應盡快釋放,或在自動刪除的路徑上設置(auto_ptr或某種引用計數的smart_ptr)。 請記住,不僅釋放了內存,還調用了對象析構函數-並且存在RIAA。

您還必須記住,如果要大量傳遞一個對象,並且該對象具有昂貴的副本構造函數,則使用對象而不是指針會導致大量開銷。

最后,您需要問自己一個物體必須生存多長時間。 如果它需要超出本地范圍,那么很可能需要成為一個指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM