C++之存儲空間的動態分配和釋放

很多時候,我們需要根據問題的實際規模來定義數組的大小,即確定實際需要使用的存儲空間的大小,這個時候就要用到動態申請、釋放存儲空間的方法。

一般情況下,變量存儲空間的分配和釋放是由系統自動完成的,不需要我們的干預。

  • 對於靜態變量,編譯時確定其空間,運行時分配,運行結束時自動釋放空間。
  • 對於動態變量,程序運行到其作用域的開始和結束處由系統動態分配、撤銷其空間。

系統對自動分配內存的變量的訪問方式有兩種:

  • 通過變量名直接訪問
  • 通過指針間接訪問

在程序運行中動態申請、釋放內存的變量,只能通過指針間接訪問。在C++中,new 用於動態申請內存,delete 用於釋放。注意:這些內存空間在程序結束前的適當時刻必須通過delete釋放。

實例

#include <iostream>
using namespace std;

int main()
{
    int n, *p, i;

    cin >> n;
//申請一個一維數組空間,數據類型是int,返回該內存空間的起始地址
    p = new int[n]; 

    for (i=0; i<n; i++)
        cin >> p[i];
    for (i=0; i<n;i++)
        cout << p[i] << '\t';
    cout << '\n';
//釋放new動態申請的內存空間
    delete []p; //==delete [n]p == delete p; 
    return 0;
}

注意:
new運算符有四種格式

  1. p = new int;
  2. p = new int(8);
  3. p = new int[n];
  4. p = new int[m][n];

其中只有格式2內存空間初始化,其他的內存空間初始值是不確定的,需要使用後續的賦值語句和通過指針間接的對其賦值。例如

p = new int;  //返回申請到的內存的起始地址
*p = 8;
(int)num = *p;

當然,不是每次申請都能成功的。爲了保證程序正確執行,最好在new後測試返回的地址。若成功,返回空間的首地址;否則返回null空指針。然後對返回值進行相關處理。如下:

float *p;
p = newe float[10];
if (p == NULL)
{
    cout << "動態申請失敗,程序終止執行!";
    exit(3);
}
else        #成功則執行程序
...  
delete p;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章