動態內存分配(new)和釋放(delete)

 

在以前咱們所寫過的程序中,所必需的內存空間的大小都是在程序執行以前就已經肯定了。但若是咱們須要內存大小爲一個變量,其數值只有在程序運行時 (runtime)才能肯定,例若有些狀況下咱們須要根據用戶輸入來決定必需的內存空間,那麼該怎麼辦呢?ios

答案是動態內存分配(dynamic memory),爲此C++ 集成了操做符 new 和 delete數組

 

1. new 和 new [] 操做符app

動態內存分配用操做符 new 。new 後面跟一個數據類型,若是要求的元素多於一個,須要加上 [],元素數量放在 [] 中。它返回一個指向內存塊開始位置的指針。語法是:spa

pointer = new type
pointer = new type [number_of_elements]
操作系統

第一個表達式爲數據類型爲 ‘type’ 的一個元素分配內存地址。第二個表達式爲數據類型爲 ‘type’ 的一組元素分配一塊內存,其中 number_of_elements 是整數型,表示元素的個數。例如:指針

 

int* foo;code

foo = new int[5];對象

 

在這個例子裏,操做系統分配了可存儲5個整型int元素的內存空間,返回指向這塊空間開始位置的指針並將它賦給foo。所以,如今foo 指向一塊可存儲5個整型元素的合法的內存空間,以下圖所示。blog

 

 

 

 

這裏,foo 是一個指針,foo指向的第一個元素能夠經過語句 foo[0] 或 *foo 獲得,二者是等價的。第二個元素能夠經過語句 foo[1] 或 *(foo+1) 獲得,依次類推......內存

那麼剛纔所做的給指針分配內存空間與定義一個普通的數組有什麼不一樣呢?最重要的不一樣是,一個普通數組的長度必須是一個常量,這就將它的大小在程序執行以前就被決定了。而採用動態內存分配時,數組的長度能夠常量或變量,其值能夠在程序執行過程當中再肯定

動態內存分配一般由操做系統控制,在多任務的環境中,它能夠被多個應用(applications)共享,所以內存有可能被用光。若是這種狀況發生,操做系統將不能在遇到操做符new 時分配所需的內存,一個空值指針(null pointer)將被返回。

 

C++ 提供兩種標準機制來檢查內存是否分配成功:

  (1)處理異常

  這種方法,當內存分配失敗時,會拋出一個 bad_alloc 類型的異常。而後程序被終止。

  這個方法是默認使用 new 時具備的異常方法,也就是:

  foo = new int[5];

  (2)使用 nothrow 。

  當內存分配失敗時,它不拋出異常 或 終止程序,而是被 new 返回一個空值指針,程序照常執行。

  nothrow 是一個在頭文件 <new> 中被聲明的特殊對象,做爲 new  的參數:

  foo = new (nothrow) int[5];

  當分配內存時,能夠檢查 foo 的值,如果 空值指針 null pointer 則是分配失敗:

  int* foo;

  foo = new (nothrow)int[5];

  if (foo == nullptr){//採起的措施}

2. delete 和 delete[] 操做符

大部分狀況下,動態分配的內存只在程序運行的具體的階段內纔有用,一旦它再也不被須要,就要被釋放掉,以便後面的內存分配可以使用。這就用到了delete 操做符。語法:

delete pointer;

delete []pointer;

第一種表達形式用來刪除給單個元素分配的內存,第二種表達形式用來刪除多元素(數組)的內存分配。

 

用 delete 釋放內存時,被釋放的指針,其指向的內存要麼是經過 new 分配的;要麼是空指針(null pointer)(對於空指針,delete 不會作任何操做)。

 

#include <iostream> #include <new>//不寫vs2010不會報錯

using namespace std; int main{ int i ,n; int* p; cout<<"How many numbers would you like to type ? " cin>>i;
p
= new (nothrow)int [i];  //根據用戶輸入動態分配內存 if (p == nullptr)  //檢查內存是否分配成功
{cout<<"Error: member could not be allocatec!"} else {   for(n = 0; n < i; n++)   {     cout<<"Enter number :";     cin>>p[n];   }   cout<<"You have entered :"   for(n = 0; n < i; n++)   {     cout<<p[n]<<", ";   }   delete []p; }   return 0; } 

 

 C語言中使用 malloc, calloc, realloc 和 free 操做內存。C++ 也支持這些語法,這些語法定義在頭文件 <cstdlib> 中 (C 語言是在<stdlib.h>)。但這些與 new, delete 並不兼容,不要混用。

相關文章
相關標籤/搜索