c 中指標的記憶體申請和記憶體釋放問題

2021-06-29 10:03:02 字數 1238 閱讀 9748

c++中指標在new和delete操作的時候對記憶體堆都做了些什麼呢,以下解:

1、指標的new操作:

void main()

輸出為:

0x00431bf0

4分別為分配的空間位址和位址內存放的值。

如果寫為:

void main()

輸出為:4

程式的意思就是將0x00431bf0記憶體位址開始的4個byte的塊取出轉換為int型別輸出,即直接讀取記憶體。

2、指標的delete操作:

指標在delete的時候,會將指標指向的記憶體區域釋放掉,而指標同記憶體區域的聯絡並沒有被切斷,仍然會只想原來指向的記憶體區域。如:

void main()

程式輸出:

0x00431bf0

40x00431bf0

-572662307

可以看到p前後指向的位址是相同的,而指向位址的記憶體區域被釋放。

3、空指標:

空指標指向的記憶體區域為記憶體的首位址,是不可讀寫的區域,即空指標不提供操作。刪除空指標是安全的(因為它什麼也沒做)。所以,在寫建構函式,賦值操作符,或其他成員函式時,類的每個指標成員要麼指向有效的記憶體,要麼就指向nullptr,那在你的析構函式裡你就可以只用簡單地delete 掉他們,而不用擔心他們是不是被new 過。如:

void main() //輸出0x00000000

4、取出記憶體區域的值

void main();

int *pi = a;

char *p = (char*)pi;

cout << *(int *)p++ << endl;  //取出p位址,轉化為取4個byte,並取出內容,之後p向後移動一位

cout << *(int *)p << endl;    //取出p位址,轉化為取4個byte,並取出內容

cout << (int)*p << endl;      //取出1個char型別,並轉換為int型

cout << (int)*(char *)pi << endl;  //取出pi位址,轉換為char型別,取出內容,並轉換為int型

}程式輸出:

261115

a的儲存區域安排為:byte1=5,byte2=1,byte3~byte8 = 0;

所以*(int *)p++取的為byte1到byte4; 之後的*(int *)p取的是byte2到byte5;

(int)*p取的是byte2;(int)*(char *)pi取的是byte1,之後轉換為int型

記憶體的申請和釋放

常規用法 virtualalloc lpvoid lpaddress,size t dwsize,dword flallocationtype,dword flprotect lpaddress,指定記憶體開始的位址。dwsize,分配記憶體的大小。flallocationtype,分配記憶體的型別...

記憶體的申請和釋放

在c裡,記憶體管理是通過專門的函式來實現。另外,為了相容各種程式語言,作業系統提供的介面通常是c 語言寫成的函式宣告 windows 本身也由c和組合語言寫成 1分配記憶體malloc函式 需要包含標頭檔案 and 函式宣告 函式原型 void malloc int size 說明 malloc 向...

私有記憶體申請和釋放

私有記憶體 獨佔物理頁 共享記憶體 和別人共享物理頁 由圖可知,多了乙個390 391,兩個物理頁 釋放記憶體 virtualfree lpvoid lpaddress,區域位址 size t dwsize,區域大小,位元組 dword dwfreetype 型別 mem decommit,線形位址...