指標和動態分配記憶體 (不定長度數組)------新標準c++程式設計

來源:互聯網
上載者:User

標籤:處理   釋放   運行   blog   分配   好的   動態   htm   類型   

背景:

  數組的長度是定義好的,在整個程式中固定不變。c++不允許定義元素個數不確定的數組。例如:

int n;int a[n];  //這種定義是不允許的

  但是在實際編程中,往往會出現要處理的資料數量在編程時無法確定的情況。如果總是定義一個儘可能大的數組,又會造成空間浪費。何況,這個“儘可能大”到底應該多大才夠呢?

  為瞭解決這個問題,c++提供了一種“動態分配記憶體”的機制,使得程式可以在運行期間,根據實際需要,要求作業系統臨時分配一片記憶體空間用於存放資料。這種記憶體配置是在程式運行中進行的,而不是在編譯時間就確定的,因此稱為“動態記憶體分配”。在c++中通過new運算子來實現動態記憶體分配。

使用方法:

  第一種用法:

P=new T;

  T是任意類型名,P是類型為T*的指標。這樣的語句會動態分配出一片大小為sizeof(T)位元組的記憶體空間,並且將該記憶體空間的起始地址賦值給P。例如:

int *p;p=new int;*p=5;

  第二行動態分配了一片4個位元組大小的記憶體空間,而p指向這片空間。通過p可以讀寫該空間。

 

  第二種用法:

  用來動態分配一個任意大小的數組:

P=new T[n];

  T是任意類型名,P是類型為T*的指標,N代表“元素個數”,可以是任何值為正整數的運算式,運算式中可以包含變數、函數調用等。這樣的語句動態分配出N x sizeof(T)個字元的記憶體空間,這片空間的起始地址被賦值給P。例如:

int* pn;int i=5;pn=new int[i*20];pn[0]=20;pn[100]=30;

  最後一行的編譯時間沒有問題,但運行時會導致數組越界。因為上面動態分配的數組只有100個元素,pn[100]已經不再動態分配的這片記憶體地區之內了。

使用結束後的處理:

  程式從作業系統動態分配所得的記憶體空間在使用完後應該釋放,交還作業系統,以便作業系統將這片記憶體空間分配給其他程式使用。c++提供delete運算子,用於釋放動態分配的記憶體空間。delete運算子的基本用法如下:

delete 指標;

  該指標必須指向動態分配的記憶體空間,否則運行時很可能會出錯。例如:

int *p=new int;*p=5;delete p;delete p;        //本句會導致程式出錯

  上面的第一條delete語句已經正確地釋放了動態分配的4個位元組記憶體空間。第二條delete語句會導致程式出錯,因為p所指向的空間已經釋放,p不再是指向動態分配的記憶體空間的指標了。

  如果是用new的第二種用法分配的記憶體空間,即動態分配了一個數組,那麼釋放該數組時,應以如下形式使用delete運算子:

delete[]指標;

  例如:

int *p=new int [20];p[0]=1;delete []p;

  同樣的,要求被釋放的指標p必須是指向動態分配的記憶體空間的指標,否則會出錯。

 

  注意:

   1、如果要求分配的空間太大,作業系統找不到足夠的記憶體來滿足,那麼動態記憶體分配就會失敗。此時程式會拋出異常。

   2、如果動態分配了一個數組,但是卻用”delete指標“的方式釋放,沒有用”[]“,則編譯時間沒有問題,運行時也一般不會發生錯誤,但實際上會導致動態分配的數組沒有被完全釋放。

   3、用new運算子動態分配的記憶體空間,一定要用delete運算子釋放,確保其後的每一條執行路徑都能釋放它。

   4、釋放一個指標,並不會是該指標的值變為NULL。

 

新標準c++程式設計

轉寄請註明出處 http://www.cnblogs.com/goudanli/p/7657712.html

指標和動態分配記憶體 (不定長度數組)------新標準c++程式設計

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.