天天看點

C/C++ 筆記(1)-- malloc 的工作原理

<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;
}
           

預先配置設定一個記憶體空間 自己來配置設定具體的空間來使用