C 中記憶體管理的實踐(理論與分析)

2021-05-27 15:27:04 字數 2281 閱讀 2689

c++中指標的使用在為語言提供極大的靈活性的同時,也使得記憶體管理變得極其複雜。如何利用好指標,並在工程實踐中組織好高效的記憶體管理策略,是乙個c++專案按時交付、並取得成功的關鍵。

本文將從理論和實踐上分析,如何通過良好的類的設計策略,來實踐乙個可在工程中使用的有效的記憶體管理方案。

1:首先,以物件導向的觀點,從總體架構上分析,乙個有效的記憶體管理策略應該達到乙個怎樣的效果。

2:接著,從類層次出發,討論針對類的設計的準則和策略。

3:然後,再深入細節,闡述實踐中可以使用的設計方法和需要注意的一些設計細節。

4:最後,再一次回到巨集觀的架構上,談談在乙個實際的專案中,如何根據專案的實際情況,權衡得失,並考慮到運用自定義的記憶體管理自身的利弊,從而來選擇真正合適具體專案的實現方案。

1:怎樣才算是乙個有效的記憶體管理方案?

c++中乙個核心的概念就是物件導向。物件導向的思想告訴我們:乙個專案的基本組成元素是類的物件。而專案功能的實現是通過物件之間的傳送和接收訊息來實現的。所以,在高層的設計中,乙個理想的main函式以及其他大部分的函式中,我們應該只會看到類物件和訊息(或稱 介面、函式)的存在,而並沒有指標的概念的存在。即:將指標的使用隱藏在類的實現的背後

指標的使用是為了提高程式的靈活性,而這一靈活性的實現具體就體現在動態記憶體的分配上,而一說到動態記憶體分配問題,則記憶體管理的問題也就接踵而來。由此可以,指標和記憶體管理這兩個屬於低層設計的概念是與生俱來的被聯絡在一起的。要實現合理的記憶體管理的過程,也就是實現合理的指標的封裝和使用的過程。

2:用類來封裝指標,隱藏記憶體管理的細節

類的設計的重要職能就是:提供高層抽象,隱藏實現細節。

客戶在使用乙個類的時候,關注的是它所提供的功能,而對於類的記憶體布局、實現細節等,一概不需要知道。客戶甚至不應該知道類的物件是怎樣建立的(是堆上還是棧上)。

注意:我們這裡所說的客戶主要指的是類的呼叫方程式**。為了實現這一職能目標,類的設計應該滿足以下準則:

(1)raii: resource acquisition isinitialization

2)類關注的是其成員變數的記憶體分配和釋放,而無需關心類自身的記憶體分配和釋放。

這是乙個遞迴的定義:類的成員變數可以是乙個類物件,而類本身所產生的物件也可以作為其他類的成員變數。那麼,這一遞迴在啥時應該終止呢?

答案是:我們所要實現的功能在哪個抽象層上,那麼相應的類就定義到該抽象層上為止。即:在該抽象層上的類已經包含了我們要實現的功能的完整的描述,所以可以直接使用,而不需要作為其他類的乙個成員變數。

(3)用棧物件來封裝堆物件

智慧型指標是這一準則的乙個實作。

這裡給出乙個標準,可以用來判斷你是否很好地使用了上述三個準則:new/delete,malloc/free只會出現在類內部的構造/析構函式以及棧物件的初始化中,而在程式實現的業務邏輯中不會出現顯式的動態資源分配

當然,這一標準也不應該絕對化,但我們應該盡量向之看齊。

3:可用的實現方法和技術

(1) 過載operator new/delete

(2) 在constructor/destructor中完成資源的分配和釋放,並根據需要過載/禁止 複製/賦值 構造/析構 函式。

(3) 智慧型指標(引用計數、所有權的轉移)

(4) 從嚴格意義上來說,每個類都有屬於為自己而設計的resource allocator,以針對類自身的特點,給出相應的資源分配方案。

如:針對大量的小物件,可考慮使用資源池。

4:具體問題具體分析

(1) 專案有大有小

如果專案很小,或者模擬較少,又或者動態分配資源的情況不多,則引入複雜的類的記憶體管理可能不是必需的。而如果專案較大,則應該給出完整的記憶體管理方案。

(2) 使用第三方庫的利與弊

boost中的shared_ptr,scoped_ptr提供了可用的智慧型指標,可以為己所用,但也要考慮專案的擴充套件性以及後期維護的成本。引入第三方庫,也同時意味著引入了外來的不確定性,這會影響專案的進度預算的可信度。

(3) 實現記憶體管理的**自身所引入的錯誤

為了實現完整的記憶體管理,這勢必增加**量。這裡要記住的是:增加的工作量永遠都是值得的,但是前提是 一定要確保記憶體管理**本身的正確性

專案管理實踐 專案管理的理論從實踐中來到實踐中去

臨時性組織研究中engwall2003年的文章很有代表性,其中提出了臨時性組織不是臨時存在的,跟過去的經歷 未來的期待和當前的情境等緊密相連。作者用到兩個電力專案進行比較研究 專案a聘用了有認證的專案經理,並建立了一整套好的專案管理制度,但該專案最終反而是不滿意的,而另外乙個正好相反,進而作者試圖分...

C語言記憶體管理分析

歡迎進入記憶體這片雷區。偉大的bill gates 曾經失言 640k ought to be enough for everybody bill gates 1981 程式設計師們經常編寫記憶體管理程式,往往提心吊膽。如果不想觸雷,唯一的解決辦法就是發現所有潛伏的地雷並且排除它們,躲是躲不了的。本...

C語言記憶體管理分析

偉大的bill gates 曾經失言 640k ought to be enough for everybody bill gates 1981 程式設計師們經常編寫記憶體管理程式,往往提心吊膽。如果不想觸雷,唯一的解決辦法就是發現所有潛伏的地雷並且排除它們,躲是躲不了的。本章的內容比一般教科書的要...