C++primer 4.3 動態數組 、 動態內存分配 new delete

簡介

  • 每一個程序在執行時都佔用一塊可用的內存空間,用於存放動態分配的對象,此存空間稱爲程序的自由存儲區或堆**

  • 當你定義一個動態數組時,就已經給你分配了內存空間,如果你只是定義卻沒有初始化,那麼內存空間裏面的元素可能沒有默認初始化,比如內置類型的動態數組

  • c++語言使用new和delete表達式實現動態內存分配,在C語言中使用的是malloc 和free 函數;

  • 要想實現初始化可以在最後面加上一對圓括號 int *pia2=new [ 10 ] ( )

  • const 對象的動態數組必須初始化

  • 動態數組用完,必須顯示釋放其佔用的內存

  • 使用delete 表達式釋放指針所指向的數組空間 delete [ ] pia

建議

======================================================================================================================

一、動態數組的創建和初始化

1.普通數組的限制

  1. 數組長度固定;
  2. 編譯時必須知道其長度;
  3. 數組只能在定義它的塊語句內存在。

因爲在實際過程中不能忍受這樣的限制,他們需要在運行時動態分配數組。

2.動態數組與普通數組的區別

  1. 雖然數組長度固定,但動態分配的數組不必在編譯時知道其長度,可以在運行時才確定數組長度;
  2. 動態數組將一直存在,直到程序顯示釋放它爲止。

3.動態數組定義

  1. 每一個程序在執行時都佔用一塊可用的內存空間,用於存放動態分配的對象,此內存空間稱爲程序的自由存儲區free store或堆heap
  2. c++語言使用new 和delete表達式實現動態內存分配,在C語言中使用的是malloc 和free 函數;
  3. 動態分配數組時,只需指定類型和數組長度,不需要爲數組對象命名,new 表達式返回指向新分配數組的第一個元素的指針
    int * pia = new int[10];
    new 表達式分配了一個含有10個int型元素的數組,並返回指向數組第一個元素的指針,該返回值初始化了指針pia.
  4. new 表達式需要指定類型以及在方括號中給出的數組維數,該維數可以是任意的表達式。
  5. 在自由存儲區內創建的數組對象是沒有名字的

4.初始化動態分配的數組

  • 定義動態數組之後可以不顯示初始化

  • 動態分配數組時,如果數組元素具有類類型,將使用該類的默認構造函數實現初始化;

  • 如果數組元素是內置類型,則無初始化,但是都是分配了內存空間的

    4.1 標準庫類型和內置類型初始化值的區別

//1.標準庫類型和內置類型動態數組默認的初始化


string *psa=new string[10];// 10個空的string
int *pia=new int[10];//10個沒有初始化的元素
int *pia2=new[10]();//加上圓括號之後就會要求編譯器對數組做值初始化,在本例中把元素都設置爲0.

//這兩個new表達式都分配了含有10個對象的數組,其中第一個數組是string類型,分配了保存對象的內存空間後,將調用string類型的默認構造函數依次初始化數組中的每個元素。

//第二個數組則具有內置類型的元素,分配了存儲10個int對象的內存空間,但是都沒有初始化。

//加上圓括號之後就會要求編譯器對數組做值初始化,在本例中把元素都設置爲0.
//2.標準類型數組和內置類型數組默認的初始化


string sa[10];//自動調用string類默認構造函數,各元素初始化爲空字符串
int ia[10];   //ia 在函數體外定義的內置數組,各元素初始化爲0
int main()
{
string  sa2[10];//自動調用string類默認構造函數,各元素初始化爲空字符串
int ia2[10];//ia 在函數體內定義的內置數組,各元素未初始化,值不確定
}
//3.標準庫類型和內置類型變量的默認初始化

int global_int;   //在函數體外定義的內置數據類型,默認初始化爲0;
string global_s;        //函數體外定義的標準庫類型,默認初始化爲空串
int main(){
int local_int;    //在函數體內定義的內置數據類型,沒有進行初始化,變量值未確定;
string local_s;       //在函數體內定義的內置數據類型,默認初始化爲空串;
return 0;
}

5.const 對象的動態數組

  • 如果我們在自由存儲區中創建的數組存儲了內置類型的const對象,則必須爲這個數組提供初始化。
  • 因爲數組元素都是const對象,無法賦值,所以必須初始化。
const int * pci_bad = new const int[100];//錯誤,必須初始化
const int *pci_bad = new const int[100]();//正確,初始化了
const string *pcs =new const string[100];//默認初始化

6.允許動態分配空數組

size_t n=get_size();
int *p=new int [n];//創建動態數組
for(int *q=p;q!=p+n;++q)

7.動態空間的釋放

  • 動態分配的內存最後必須進行釋放,否則,內存最終將會逐漸耗盡;
  • 如果不再需要使用動態數組,程序員必須顯示將其佔用的存儲空間返回給程序的自由存儲區;
  • 使用delete 表達式釋放指針所指向的數組空間 delete[ ] pia
    • 該語句回收了pia所指的數組,把相應的內存返回給自由存儲區;
    • [ ] 是必不可少的,因爲它告訴編譯器該指針指向的是自由存儲區中的數組,而不是當對象

二、動態數組的使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章