動態記憶體申請的結果 專題2

2022-06-21 06:06:10 字數 2980 閱讀 9035

實驗一:證明new_handler全域性函式是否存在

#include #include 

#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()

qt中的編譯器列印結果:

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 

#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()

利用g++編譯器,執行結果如下:

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 

#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()

可以使用new關鍵字在指定的記憶體空間上建立物件,此時必須顯式的呼叫建構函式

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...