<span style="font-size:18px;">#include <stdio.h>
#include <unistd.h>
main()
{
init *p1 = malloc(4);
*p1 = 1;
*(p1+1) = 1;
*(p1+2) = 2;
*(p1+3) = 3;
*(p1+4) = 4;
*(p1+5) = 5;</span>
<span style="font-size:18px;"></span><pre name="code" class="cpp"><span style="font-size:18px;"><span style="white-space:pre"> </span>*(p1+6) = 6;</span>
// free(p1)}
如果調用free 這句代碼 就會導緻程式報錯,原因就在于malloc在配置設定記憶體的空間的時候 不光是配置設定記憶體空間 還會用12(不一定)個位元組的資料來維護一個資料結構
malloc 的工作原理:
malloc使用一個資料結構(連結清單)維護配置設定空間
連結清單的構成:配置設定的空間/上一個空間資料/下一個空間資料
對malloc配置設定的空間不要越界通路 因為容易破壞背景維護結構,導緻malloc/calloc/realloc/free 無法正常工作
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<pre name="code" class="cpp">#include <stdio.h>
<span style="font-size:18px;">#include <unistd.h>
#include <stdlib.h>
int main()
{
init *p1 = (int*)malloc(4);
int* p2 = new int;
int *p3 = (int*)malloc(4);
int* p4 = new int;
int* p5 = new int;
int* p6 = new int;
printf("%p\n",p1);
printf("%p\n",p2);
printf("%p\n",p3);
printf("%p\n",p4);
printf("%p\n",p5);
printf("%p\n",p6);
return 0;
}</span>
輸出: 0x8429008
0x8429018
0x8429038
0x8429038
0x8429048
0x8429058
C++ 的 new 與 malloc 的關系
new 的實作 使用的是malloc來實作的, 差別: new使用malloc後 還要初始化空間,基本類型,直接初始化成預設值。UDT類型,調用構造器 new 類型()
delete 調用free來實作的,差別在于:delete負責調用析構函數,然後調用free.
new 與new[]的差別:
new 隻調用一個構造器初始化
new[ ]循環對每個區域調用構造器
-------------------------------------------------------------------------------------------------------------------------------------------------------------
定位配置設定運算符 new()
<pre name="code" class="cpp">#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <new>
int main()
char p[20];
init *p1 = new(p)int;
return 0;
}
預先配置設定一個記憶體空間 自己來配置設定具體的空間來使用