一. 當記憶體用完時
當找不到足夠大的連續的記憶體塊用於存放物件時,乙個稱為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 型別識別符號 記憶體單元個數 開闢陣列的定義方法...