c 之動態記憶體

2021-08-15 12:48:08 字數 3700 閱讀 3922

了解動態記憶體在 c++ 中是如何工作的是成為一名合格的 c++ 程式設計師必不可少的。c++ 程式中的記憶體分為兩個部分:

很多時候,您無法提前預知需要多少記憶體來儲存某個定義變數中的特定資訊,所需記憶體的大小需要在執行時才能確定。

在 c++ 中,您可以使用特殊的運算子為給定型別的變數在執行時分配堆內的記憶體,這會返回所分配的空間位址。這種運算子即new運算子。

如果您不需要動態分配記憶體,可以使用delete運算子,刪除之前由 new 運算子分配的記憶體。

下面是使用 new 運算子來為任意的資料型別動態分配記憶體的通用語法:

new

data

-type

;

在這裡,data-type可以是包括陣列在內的任意內建的資料型別,也可以是包括類或結構在內的使用者自定義的任何資料型別。讓我們先來看下內建的資料型別。例如,我們可以定義乙個指向 double 型別的指標,然後請求記憶體,該內存在執行時被分配。我們可以按照下面的語句使用new運算子來完成這點:

double

* pvalue

= null

; // 初始化為 null 的指標

pvalue

= new

double

; // 為變數請求記憶體

如果自由儲存區已被用完,可能無法成功分配記憶體。所以建議檢查 new 運算子是否返回 null 指標,並採取以下適當的操作:

double

* pvalue

= null

; if(!

(pvalue

= new

double))

malloc()函式在 c 語言中就出現了,在 c++ 中仍然存在,但建議盡量不要使用 malloc() 函式。new 與 malloc() 函式相比,其主要的優點是,new 不只是分配了記憶體,它還建立了物件。

在任何時候,當您覺得某個已經動態分配記憶體的變數不再需要使用時,您可以使用 delete 操作符釋放它所占用的記憶體,如下所示:

delete

pvalue

;// 釋放 pvalue 所指向的記憶體

下面的例項中使用了上面的概念,演示了如何使用 new 和 delete 運算子:

#include

<

iostream

>

using

namespace

std; 

intmain()

當上面的**被編譯和執行時,它會產生下列結果:

value

of pvalue

:29495

假設我們要為乙個字元陣列(乙個有 20 個字元的字串)分配記憶體,我們可以使用上面例項中的語法來為陣列動態地分配記憶體,如下所示:

char

*pvalue

=null

;// 初始化為 null 的指標

pvalue

=new

char[20

];// 為變數請求記憶體

要刪除我們剛才建立的陣列,語句如下:

delete

pvalue

;// 刪除 pvalue 所指向的陣列

下面是 new 操作符的通用語法,可以為多維陣列分配記憶體,如下所示:

// 動態分配,陣列長度為 

mint

*array

=new

int[m]

;  //釋放記憶體

delete

array;

int**

array

// 假定陣列第一維長度為 m, 第二維長度為 n

// 動態分配空間

array

= new

int*[m

];for

(inti=

0; ii++ )

//釋放

for(inti=

0; ii++ )

delete

array;

二維陣列例項測試:

#include

<

iostream

>

using

namespace

std;

intmain()

for(i=

0; i<4;

i++)

}//列印資料

for(i

=0; i

<4;

i++)

}//開始釋放申請的堆

for(i

=0; i

<4;

i++)

delete

p;return0;

} int***

array

;// 假定陣列第一維為 m, 第二維為 n, 第三維為h

// 動態分配空間

array

= new

int**[m

];for

(inti=

0; ii++ )

}//釋放

for(inti=

0; ii++ )

delete

array[i

];}

delete

array;

三維陣列測試例項:

#include

using

namespace

std;

int

main()

//輸出

p[i][j][k]

三維資料

for(i=0;i<2;i++)

cout<}
cout<}

//釋放記憶體

for(i=0;i<2;i++)

}

for(i=0;i<2;i++)

delete

p;

return

0;

}

物件與簡單的資料型別沒有什麼不同。例如,請看下面的**,我們將使用乙個物件陣列來理清這一概念:

#include

using

namespace

std;

class

box

~box()
};
int

main()

如果要為乙個包含四個 box 物件的陣列分配記憶體,建構函式將被呼叫 4 次,同樣地,當刪除這些物件時,析構函式也將被呼叫相同的次數(4次)。

當上面的**被編譯和執行時,它會產生下列結果:

呼叫建構函式!

呼叫建構函式!

呼叫建構函式!

呼叫建構函式!

呼叫析構函式!

呼叫析構函式!

呼叫析構函式!

呼叫析構函式!

C 回顧之動態記憶體

每個程式的記憶體空間 靜態記憶體 區域性static物件,類static資料成員以及定義在函式體外的變數 棧記憶體 函式內的非static變數 堆 動態分配 程式在執行時分配的物件,生存期由程式控制 shared ptr的使用 也可以使用auto shared ptr p make shared 1...

C之動態記憶體分配

在編寫程式時,通常並不知道需要處理的資料量,或者難以評估所需處理資料量的變動程度。在這種情況下,要達到有效的資源利用,必須在執行時動態地分配所需記憶體,並在使用完畢後盡早釋放不需要的記憶體,這就是動態記憶體管理原理。參考文章 1 c語言動態記憶體管理和動態記憶體分配 標準庫stdlib.h提供以下四...

C 之動態記憶體管理

想必很多學習c 的人都有很深厚的c語言基礎.在c語言中,我們是用malloc,calloc,realloc三位男士和free一位女士來動態管理記憶體的 先coding一下c語言的基本動態記憶體管理模式 void rammanagebyc 然而這種初始化方式是有很大的缺陷的 首先它的初始化非常的難受,...