實驗一:證明new_handler全域性函式是否存在
#include #includeqt中的編譯器列印結果:#include
#include
using
namespace
std;
class
test
~test()
void* operator
new (unsigned int size)
void
operator delete (void*p)
void* operator
new (unsigned int size)
void
operator delete (void*p)
};//
自定義new_handler函式
void
my_new_handler()
void
ex_func_1()
}//這裡想證明預設的處理函式new_handler確實丟擲乙個bad_alloc的異常。
catch(const bad_alloc&)
}int
main()
func = 0; 說明在該編譯器中沒有預設的new_handler函式。
使用g++編譯器,列印結果:
func = 0; 說明在該編譯器中沒有預設的new_handler函式
使用visual studio 2010編譯器,列印結果:
func = 00000000,說明在該編譯器中沒有預設的new_handler函式
使用bcc編譯器,列印結果:
func = 某個位址
catch(const bad_alloc&) ,說明在該編譯器中確實存在乙個new_handler的全域性函式。new_hander函式在呼叫之後,確實丟擲了異常。
實驗二:當動態申請失敗時,統一編譯器的行為,提供**的移植性
#include #include利用g++編譯器,執行結果如下:#include
#include
using
namespace
std;
class
test
~test()
void* operator
new (unsigned int size)
void
operator delete (void*p)
void* operator
new (unsigned int size)
void
operator delete (void*p)
};//
自定義new_handler函式
void
my_new_handler()
void
ex_func_2()
intmain()
operator new: 4
test()
段錯誤為什麼會出現這種現象?
首先是呼叫了我們自己定義的new,然後分配記憶體失敗,返回乙個null,然後又在這個null上建立了乙個物件,去操作0位址,不出現段錯誤才怪呢。
利用qt編譯器,結果如下:
operator new: 4
test()
程式崩潰
visual stdio 2010編譯器,結果如下:
operator new: 4
pt = 0
從上面可以看出,3個編譯器的行為是不統一的。為了提高程式的移植性,想要統一編譯器的行為,又要怎麼做呢?
想要統一編譯器的行為為:不管哪個編譯器,動態記憶體失敗了,直接返回空指標就行了,不要做其他多餘的事情了
對new的過載進行異常規格的說明,不管怎樣都不會去扔出異常。
void* operator執行時結果:new (unsigned int size) throw
()
void* operator
new (unsigned int size) throw
()
operator new:4
pt = 0
實驗三:在單次申請時告訴編譯器不管結果是什麼,都不要丟擲異常。如果申請失敗,直接返回空指標
#include #include可以使用new關鍵字在指定的記憶體空間上建立物件,此時必須顯式的呼叫建構函式#include
using
namespace
std;
void
ex_func_3()
;
struct
st ;
//將st物件建立到bb這個陣列所在的棧空間。如何去做呢?
//在指定的位置建立乙個物件,通過new關鍵字來實現,後面的括號表明位址,即要將物件建立到哪的那個位址。
st* pt = new
(bb) st();
pt->x = 1
; pt->y = 2
;
//目的就是要看看,有沒有將st的物件建立到陣列bb所在的記憶體空間上。
cout << bb[0] <
cout
<< bb[1] <
//顯示的呼叫析構函式,因為指定了建立物件的空間,此時必須要顯式的手動的來呼叫析構函式了。
pt->~st();
}int
main()
C 外傳篇 3 動態記憶體申請的結果
問題 動態記憶體申請一定成功嗎?c void code free p c void code delete p 問題 new 語句中的異常是怎麼丟擲來的呢?失敗 可以自定義 new handler 函式 void my new handler int main int argc,char ar 公用...
關於動態記憶體申請的部落格
動態記憶體 malloc 動態申請記憶體 int arr int malloc n sizeof int int arr n 定義乙個n長度的陣列 如果要使用,需引用標頭檔案 需注意 1.棧的大小1m,可配 2.堆的分配的最大連續塊1.2g calloc動態申請記憶體,並將裡面的值置為0 int a...
C語言動態記憶體申請分析
1 c語言中的一切操作都是基於記憶體的 2 變數和陣列都是記憶體的別名 1 記憶體分配由編譯器在編譯期間決定 2 定義陣列的時候必須指定陣列的長度 3 陣列的長度是在編譯期間就必須確定的 1 malloc和free用於執行動態記憶體分配和釋放 2 malloc所分配的是一塊連續的記憶體 3 mall...