new和delete分配記憶體

2021-06-19 10:52:09 字數 2594 閱讀 8011

一.  當記憶體用完時

當找不到足夠大的連續的記憶體塊用於存放物件時,乙個稱為new-handler的函式被呼叫,或者檢查指向函式的指標,如果非0,則那個函式被呼叫;new-handler的預設動作是丟擲乙個異常。通過包含new.h,然後以我們想呼叫的函式位址為引數,呼叫set_new_handler()函式,這樣就替換了new-handler

#include #include #include using namespace std;

void out_of_memory()

int main()

二. 為什麼要過載new和delete

1. 被new和delete使用的記憶體分配系統是為通用目的設計的,我們也需要建立、銷毀乙個特定類的非常多的物件,以至於這個運算成了速度瓶頸

2. 分配不同大小的記憶體,會導致記憶體碎片,因此可能還有記憶體,但是找不到足夠大小的連續記憶體,因此需要定製記憶體分配器

3. 在嵌入式系統中,要求分配記憶體花費相同的時間,且不允許出現堆耗盡或出現很多碎片的情況,因此需要定製記憶體分配器

注釋:當我們過載new時,可以改變的只是記憶體分配部分(delete類似)

三. 過載全域性new和delete

#include #include void* operator new(size_t sz)

void operator delete(void* m)

class s

~s()

virtual int count() };

int main()

執行結果:

注釋:1. 因為類s有個虛函式,所以物件大小多出4個位元組用於存放指向虛函式表的指標  2. 陣列大小多出4個位元組,用於存放陣列的長度等資訊  3. 這裡使用printf和puts而不是iostream,因為當建立乙個iostream物件時(全域性cin、cout、cerr),他們會呼叫new分配記憶體,會進入死迴圈,printf不會呼叫new來初始化自己

四. 為乙個類過載new和delete

為乙個類過載new和delete時,不必說明是static,它預設為static成員函式

#include #include using namespace std;

ofstream out("framis.out");

class framis

; framis()

~framis()

void* operator new(size_t);

void operator delete(void*);

};unsigned char framis::pool[psize * sizeof(framis)];

unsigned char framis::malloc_map[psize] = ;

void* framis::operator new(size_t)

} out << "out of memory" << endl;

return 0;

}void framis::operator delete(void* m)

int main()

new framis; //out of memory

delete f[10];

f[10] = 0;

framis* x = new framis;

delete x;

for (int j = 0; j < framis::psize; j++)

system("pause");

return 1;

}

五. 為陣列過載new和delete

#include #include using namespace std;

ofstream trace("newarray.out");

class widget

~widget()

void* operator new(size_t sz)

void operator delete(void* p)

void* operator new(size_t sz)

void operator delete(void* p) };

int main()

六. 物件放置

1. 可能想在記憶體的指定位置放置乙個物件,這對於嵌入式系統特別重要

2. 呼叫new時,可以從不同的記憶體分配器中進行選擇

這兩種需求,都可以通過相同的機制實現,過載運算子new時,帶多於乙個引數,第乙個引數是物件長度,它是在內部計算並由編譯器傳遞。其他的引數可以有我們定義:乙個放置物件的位址、乙個對記憶體分配的函式或物件的引用、或其他方便的任何設定

#include #include using namespace std;

class x

~x()

void* operator new(size_t, void* loc) };

int main()

c 記憶體分配(new和delete)

c中malloc和free是函式,包含在stdlib.h標頭檔案中,分配成功返回指標,失敗返回空指標。與new的區別是 1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc f...

使用new分配記憶體和delete刪除記憶體

在我們寫程式使用指標的時候,必須對指標進行手動初始化,否則會存在出現bug的可能性,c 為我們提供了一種管理指標的方法。在c 中,我們可以通過new來為建立的指標自動分配記憶體,避免手動分配 手動分配較為麻煩,如下所示 int heggle 5 int ptr heggle 使用new進行記憶體分配...

New動態分配 Delete 釋放記憶體

在c 中,對於變數和物件都是編譯器在編譯時分配好的,對於陣列初始化時,無法確定多少記憶體,很容意造成大開小用的情況。new 動態分配 一般格式 1.指標變數名 new 型別識別符號 2.指標變數名 new 型別識別符號 初始值 3.指標變數名 new 型別識別符號 記憶體單元個數 開闢陣列的定義方法...