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,線形位址...