[英]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(我不知道哪個版本)是一個沒有發生的示例,因此在運行這些程序時必須重新啟動。
但是,不刪除已更新的內容是不正確的做法,因為程序會不斷增長,並且之前“可以接受的”內容可能突然導致內存泄漏,並可能導致系統不穩定。
可能無法刪除的示例(我不建議您在這種情況下不關心):
當然,在簡單的情況下,最好按照其他答案中的建議分配沒有新的資源。
當當前范圍關閉時, 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.