簡體   English   中英

如果我在C ++中使用堆,我在做錯什么嗎?

[英]Am I doing something wrong if I am using the heap in C++?

對RAII的了解越來越多,我了解使用堆棧是確保代碼是異常安全的方法。

這是否意味着每次我在代碼中執行new()時,我都會做錯事,某種意義上說,使用RAII原理可以找到更好的方法?

我認為您還沒有完全理解RAII的真正含義。 動態分配,與程序中需要其他資源(例如文件,數據庫連接等)的方式相同。 RAII專注於如何管理那些資源,而解決方法是使資源由具有自動存儲持續時間的對象(堆棧或作為另一個對象的成員)進行管理。

這並不意味着必須在堆棧中分配所有資源,而是意味着如果您在堆中分配某些內容,則應將管理內存的職責委派給堆棧中的對象。

如果您使用new ,則不一定要做錯什么,但是值得檢查一下您做對了嗎。

  • new表達式的結果應立即放置在智能指針的控制下,通常是將其直接傳遞給構造函數。
  • 如果該智能指針是shared_ptr ,那么您可能做錯了。 您可能應該改用make_shared 在某些情況下,您不應該這樣做(對大型對象使用weak_ptr ),在某些情況下,您不應該這樣做(沒有Boost的C ++ 03)。
  • 如果使用delete那么除非您正在編寫自己的智能指針類,否則您幾乎做錯了。 即使這樣,您的智能指針也可以使用另一個智能指針來保存工作。
  • 這不是必須的,但是如果僅因為對象“對於堆棧而言太大”而使用new ,請考慮使用unique_ptrscoped_ptr來管理該對象的類,以便從用戶的角度出發他們處理的對象是自動變量。 如果您願意,可以將其擴展到完整的PImpl習慣用法。 即使您不希望使用其他類,也請考慮一個創建對象並向其返回unique_ptr的函數,然后可以像auto foohandle = give_me_a_foo();一樣調用它auto foohandle = give_me_a_foo(); 然后, give_me_a_foo包含new ,但是其他用戶代碼則沒有,因此您建議您將內容自動填充到RAII對象中。

在C ++中,有很多替代RAII的資源管理策略,但是如果您使用它們,您會知道的,這會影響算作“錯誤”的東西。

一點也不。 如果野獸的本質(分配要求)確實是動態的,那么最終它要么是來自堆,要么是堆棧指針上的一些嚴重欺騙。

最好的辦法是使用適合您的范圍保護的包裝。 (我無法告訴您,當我需要受范圍保護的動態臨時緩沖區時,我經常使用std :: vector <>)。 使用諸如STL等維護良好且設計良好的庫是最理想的原因之一。與C#或Java不同,它的可預測性在真正需要時具有巨大的價值。

不,堆棧空間非常有限,因此您不想在上面放很多東西,因此術語堆棧溢出。 同樣,如果您需要一個對象的壽命比您的函數更長,那么您就不能將其放在堆棧上。

暫無
暫無

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

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