c 中用new分配記憶體

2021-09-21 18:18:08 字數 2050 閱讀 3398

new的作用和使用方法如下:

new的作用在於可以在程式執行階段動態分配記憶體,記憶體的大小在執行時根據需要確定,從而

高效利用記憶體空間。

new的使用方法如下:

typename* pointer_name = new typename
使用時使用者需要指定型別(指標型別和要開闢的記憶體儲存的資料型別),new可以自動找到乙個

正確長度的記憶體塊,並返回記憶體塊的位址。分配記憶體失敗時,預設丟擲bad_alloc異常。

比如:

int* p = new int;
這裡指定了int型,new會自動找到適合儲存int的記憶體,將位址返回賦給指標p。

此時,使用new開闢的記憶體塊只能通過指標p來訪問,這塊記憶體是未命名的。

要注意一點:new分配的記憶體位於堆(heap)或自由儲存區(free store)中,而常規變數分配

的記憶體是在棧(stack)中。堆和棧的區別在於:棧(stack)由編譯器自動分配釋放,而堆

(heap)一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os**。

在使用new時,釋放記憶體的方法就是delete。

使用delete釋放記憶體

delete可以釋放記憶體供其他部分使用。方法十分簡單,在delete後加指向待釋放記憶體的指標即可,比如:

int* p = new int;

delete p;

這樣就可以釋放掉通過new為開闢的記憶體了。

需要注意的是,delete只能釋放由new開闢的記憶體。注意以下三種情況:

如果試圖釋放常規變數宣告分配的記憶體,會報錯。

如:

//delete不能釋放常規變數宣告分配的記憶體

int i =3;

int* p = &i;

如果試圖釋放已被delete釋放的記憶體,會報錯。如:

//delete釋放後,p指標不會被刪除,而是重新指向了一處新的位址。

int* p = new int;

delete p;

delete p;

delete可以釋放空指標,這是安全的,不報錯。如:

int* p = null;

delete p;

delete p;

使用new建立動態陣列

之前說了,new可以在執行時動態分配記憶體,這一作用的具體體現就是建立動態陣列。

如:

int data[100]=;
這裡宣告乙個int型陣列,長度為100,其記憶體空間在編譯時已經分配好了。無論這個陣列在實際執行中使用了多少,總是會占用那部分記憶體空間。

而如果使用new建立動態陣列:

int* p = new int [100];   //p指向動態陣列的首位址
其記憶體是在執行時在分配的,當不使用時可以使用delete釋放掉。釋放動態陣列時需要加:

int* p = new int [100];

delete p;

如果不加,但不會報錯,結果是不確定的,不要這樣做。

這裡貼乙個c++ primer plus中的乙個例子,個人感覺十分巧妙。

#include#includeusing namespace std;  

char* getname(void);

int main(void)

char* getname()

可以看到,動態陣列實際是在getname函式中建立的。通過臨時字元陣列temp儲存輸入的字串,

通過strlen(temp)+1計算需要的字串長度提供給new,實現開闢對應大小的記憶體空間,並通過

strcpy(pn, temp)將字串複製到新開闢的記憶體處。

這樣做可以每次都建立剛好能夠儲存輸入字串的記憶體塊,在讀取大量字串的程式中,可以節省大量記憶體。

需要注意的是,這裡new和delete放在了不同的函式中,這樣是可以的,但容易忘記delete。

c 記憶體分配(new和delete)

c中malloc和free是函式,包含在stdlib.h標頭檔案中,分配成功返回指標,失敗返回空指標。與new的區別是 1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc f...

C 使用new來分配記憶體

對位址的工作方式有一定了解後,來看看它如何實現在程式執行時分配記憶體。前面我們都將指標初始化為變數的位址 變數是在編譯時分配的有名稱的記憶體,而指標只是為可以用過名稱直接訪問的記憶體提供了乙個別名。指標真正的用武之地在於,在執行階段分配未命名的記憶體以儲存值。在這種情況下,只能通過指標來訪問。在c語...

C 記憶體 new與malloc分配記憶體區別

一關於記憶體 1 記憶體分配方式 記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在 例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些存 儲單元自動被釋放。棧...