[英]Am I doing something wrong if I am using the heap in C++?
我認為您還沒有完全理解RAII的真正含義。 動態分配,與程序中需要其他資源(例如文件,數據庫連接等)的方式相同。 RAII專注於如何管理那些資源,而解決方法是使資源由具有自動存儲持續時間的對象(堆棧或作為另一個對象的成員)進行管理。
這並不意味着必須在堆棧中分配所有資源,而是意味着如果您在堆中分配某些內容,則應將管理內存的職責委派給堆棧中的對象。
如果您使用new
,則不一定要做錯什么,但是值得檢查一下您做對了嗎。
new
表達式的結果應立即放置在智能指針的控制下,通常是將其直接傳遞給構造函數。 shared_ptr
,那么您可能做錯了。 您可能應該改用make_shared
。 在某些情況下,您不應該這樣做(對大型對象使用weak_ptr
),在某些情況下,您不應該這樣做(沒有Boost的C ++ 03)。 delete
那么除非您正在編寫自己的智能指針類,否則您幾乎做錯了。 即使這樣,您的智能指針也可以使用另一個智能指針來保存工作。 new
,請考慮使用unique_ptr
或scoped_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.