天天看點

深入了解c++之動态記憶體和指針

      在C++中,對象可以靜态配置設定——即編譯器在處理程式源代碼時配置設定,也可以動态配置設定——即程式執行時調用運作時刻庫函數來配置設定。這兩種記憶體配置設定方法的主要差別是效率與靈活性之間的平衡準則不同。由于靜态記憶體配置設定是在程式執行之前進行的因而效率比較高,但是它缺少靈活性,它要求在程式執行之前就知道所需記憶體的類型和數量。例如利用靜态配置設定的字元串數組,我們無法很容易地處理和存儲任意的文本檔案。一般來說存儲未知數目的元素需要動态記憶體配置設定的靈活性。

      關于c++中的動态配置設定我們必須了解c++中的指針,在C++中指針的主要用處是管理和操縱動态配置設定的記憶體,在具體讨論起用法之前我們先要注意靜态和動态記憶體配置設定的差別:

      1.靜态對象是有名字的變量我們直接對其進行操作而動态對象是沒有名字的變量我們通過指針間接地對它進行操作稍後我們會看到一個例子

      2.靜态對象的配置設定與釋放由編譯器自動處理,我們需要了解這一點但不需要做任何事情。相反動态對象的配置設定與釋放必須由程式員顯式地管理,相對來說比較容易出錯,它通過new 和delete 兩個表達式來完成對象的動态配置設定,可通過new 表達式的兩個版本之一來完成第一個版本用于配置設定特定類型的單個對象例如

       int *point = new int( 1000 );

      配置設定了一個沒有名字的int 類型的對象對象初始值為1000, 然後表達式傳回對象在記憶體中的位址接着這個位址被用來初始化指針對象point ,對于動态配置設定的記憶體惟一的通路方式是通過指針間接地通路

       new 表達式的第二個版本用于配置設定特定類型和維數的數組例如

       int *pia = new int[ 4 ];

配置設定了一個含有四個整數元素的數組,不幸的是我們沒有辦法給動态配置設定的數組的每個元素顯式地指定一個初始值,配置設定動态數組時一個常令人迷惑的問題是傳回值隻是一個指針與配置設定單一動态對象的傳回類型相同,例如point與pia 的不同之處在于pia 擁有四元素數組的第一個元素的位址而point 隻是簡單地包含單一對象的位址,當用完了動态配置設定的對象或對象的數組時我們必須顯式地釋放這些記憶體,我們可以通過使用delete 表達式的兩個版本之一來完成這件事情,而釋放之後的記憶體則可以被程式重新使用單一對象的delete 表達式形式如下

    // 删除單個對象

     delete point;

    數組形式的delete 表達式如下

   // 删除一個對象數組

    delete [] pia;

如果忘了删除動态配置設定的記憶體又會怎麼樣呢?如果真的如此程式就會在結束時出現記憶體洩漏memory leak 的問題,記憶體洩漏是指一塊動态配置設定的記憶體我們不再擁有指向這塊記憶體的指針,是以我們沒有辦法将它返還給程式供以後重新使用現在大多數系統提供識别記憶體洩漏的工具可以向系統管理者咨詢.