一文搞懂C 動態記憶體

2022-10-03 15:42:17 字數 2185 閱讀 3996

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

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

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

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

new 和 delete 運算子

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

new data-type;

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

double* pvalue = null; // 初始化為 null 的指標

pvalue = new double; // 為變數請求記憶體

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

double* pvalue = null;

if( !(pvalue = new double ))

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

value of pvalue : 29495

陣列的動態記憶體分配

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

char* pvalue = null; // 初始化為 null 的指標

pvalue = new char[20]; // 為變數請求記憶體

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

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

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

一維陣列

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

int 程式設計客棧*array=new int [m];

//釋放記憶體

delete array;

二維陣列

int **array

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

// 動態分配空間

array = new int *[m];

for( int i=0; i

二維陣列例項測試:

例項#include

using namespace std;

int main()

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

} //列印資料

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

delete array[i];

}delete array;

三維陣列測試例項:

例項#include

using namespace std;

int main()

//輸出 p[i][j][k] 三維資料

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

{ for(j=0; j<3; j++)

{ for(k=0;k<4;k++)

{ p[i][j][k]=i+j+k;

cout<

物件的動態記憶體分配

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

例項#include

using namespace std;

class box

{ public:

box() {

cout << "呼叫建構函式!" <

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

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

呼叫建構函式!

呼叫建構函式!

呼叫建構函式!

呼叫建構函式!

呼叫析構函式!

呼叫析構函式!

呼叫析構函式!

呼叫析構函式!

一文搞懂記憶體屏障

gcc編譯選項中有個 o選項,表示編譯 的時候進行優化。這樣就會出現一種可能 優化後的 和優化前的 順序不一致。來看個例子 8 include9 10 int a,b 11 12 int main 13 很簡單,我們使用不加優化選項來將其編譯為組合語言 yuhao laplace workspace...

一文搞懂transform skew

目錄 如何理解斜切 skew,先看乙個 demo。在下面的 demo 中,有 4 個正方形,分別是 紅色 不做 skew 變換,綠色 x 方向變換,藍色 y 方向變換,黑色 兩個方向都變換,拖動下面的滑塊可以檢視改變 skew 角度後的效果。切換 selector 可以設定 transform or...

一文搞懂property函式

接下來我帶大家了解乙個函式的作用以及使用技巧,希望對大家都有幫助,話不多說,接下來就開始我的表演特性 首先property有兩種用法,一種是作為函式的用法,一種是作為裝飾器的用法,接下來我們就逐一分析 property函式 看一下作為函式它包含的引數都有哪些 property fget none,f...