C 記憶體管理筆記 一

2021-10-02 18:08:06 字數 2481 閱讀 4873

c++記憶體分配的四個層面 : 

四個層面的比較:

記憶體分配與釋放的測試:

void* p1 = malloc(512);    //

512 bytes

free

(p1);

complex

* p2 = new complex; //

one object

delete

p2;

void* p3 = ::operator

new(512); //

512 bytes

::operator

delete

(p3);

//以下使用 c++ 標準庫提供的 allocators。

//其介面雖有標準規格,但實現商業並未完全遵守;下面三者形式略同。

#ifdef _msc_ver

//以下兩函式都是 non-static,定要通過 object 呼叫。以下分配 3 個 ints.

int* p4 = allocator().allocate(3, (int*)0

); allocator

().deallocate(p4,3

);

#endif

#ifdef __borlandc__

//以下兩函式都是 non-static,定要通過 object 呼叫。以下分配 5 個 ints.

int* p4 = allocator().allocate(5

);

allocator

().deallocate(p4,5

);

#endif

#ifdef __gnuc__

//以下兩函式都是 static,可通過全名呼叫之。以下分配 512 bytes.

//void* p4 = alloc::allocate(512);

//alloc::deallocate(p4,512);

//以下兩函式都是 non-static,定要通過 object 呼叫。以下分配 7 個 ints.

void* p4 = allocator().allocate(7

); allocator

().deallocate((int*)p4,7

);

//以下兩函式都是 non-static,定要通過 object 呼叫。以下分配 9 個 ints.

void* p5 = __gnu_cxx::__pool_alloc().allocate(9

); __gnu_cxx::__pool_alloc

().deallocate((int*)p5,9

);

#endif

new關鍵字的實現:

首先new是被編譯器編譯成三步:

com * p = new com(1,2);

等價於 :

void * mem = ::operator new(sizeof(com)); // 記憶體分配

p = static_cast(mem);        // 強制型別轉換

p->com::com(1,2);             // 構造函式呼叫(自己這麼寫在大部分編譯器上不支援,但是實際上只是編譯器的實現阻止了這麼寫)

我們可以知道 new分配記憶體 是通過 operator new() 函式實現的。

而 operator new() 的函式實現實際上是依靠 malloc 實現的,如下圖 :

operator new() 不斷地迴圈呼叫 malloc(),如若分配記憶體不成功的話。

但實際上還有另乙個操作就是呼叫 _callnewh(size), 這個函式可以由我們重寫。

當malloc也分配不出記憶體時,就會呼叫它,我們可以將其重寫為 : 釋放部分我們認為可以釋放的記憶體,然後下次malloc就能分配到記憶體了。

而 operator new() 還有第二個引數 : 預設為不報錯,如若要報錯可以自己指定。

delete 關鍵字的實現:

如圖所示 : delete 先呼叫其析構函式,然後再使用 operator delete()釋放記憶體,而 operator delete其實只是簡單地呼叫了free()。

C 記憶體管理(一)

1 記憶體分配方式 1 從靜態儲存區域分配。例如使用static 全域性變數。靜態儲存區的資料在程式編譯的時候就已經分配好了,在程式執行期間一直存在,只有在程式推出之後才會釋放。2 在棧上分配。函式內部的區域性變數都是在棧上分配的,在函式階數時儲存空間便被釋放 3 在堆上分配。程式設計師根據自己的需...

C 記憶體管理(一)

1 記憶體分配方式 1 從靜態儲存區域分配。例如使用static 全域性變數。靜態儲存區的資料在程式編譯的時候就已經分配好了,在程式執行期間一直存在,只有在程式推出之後才會釋放。2 在棧上分配。函式內部的區域性變數都是在棧上分配的,在函式階數時儲存空間便被釋放 3 在堆上分配。程式設計師根據自己的需...

C學習筆記 記憶體管理

乙個c語言變數的作用域可以是 塊 作用域,函式作用域或者檔案作用域 塊是 之間的一段 同乙個 塊不可以有重名變數 auto自動變數 一般情況下 塊內部定義的變數都是自動變數 也可以顯示的使用aotu關鍵字 auto int i register暫存器變數 通常變數在記憶體當中,如果能把變數放到cpu...