c 關於new檔案

2022-05-27 23:03:13 字數 3767 閱讀 9507

new檔案用來管理c++的動態記憶體,這個檔案宣告了幾個全域性空間的函式(不是std空間的函式,全域性空間的函式呼叫時是用全域性作用域解析符),包括operator new 和operator delete的過載 ,這些函式用於處理動態儲存空間請求。

其new的標頭檔案源**

#ifndef _new

#define _new#include

#include

extern

"c++

"

virtual ~bad_alloc() throw

(); };

//當記憶體分配失敗時用此結構體替代異常,使用嵌入式環境,嵌入式環境沒有異常功能

struct

nothrow_t ;

extern

const

nothrow_t nothrow;

///當記憶體分配失敗時,呼叫new_handler

///new_handler試著去分配更多得儲存空間,當且僅當申請記憶體成功時,才會返

///否則丟擲bad_alloc異常或者終止程式(呼叫abort或者exit)

typedef void (*new_handler)();

new_handler set_new_handler(new_handler)

throw

();}

//namespace std

//全域性空間函式,呼叫時加上作用域解析符,如::operator new ()

void* operator

new(std::size_t) throw

(std::bad_alloc);

void* operator

new(std::size_t) throw

(std::bad_alloc);

void

operator delete(void*) throw

();void

operator delete(void*) throw

();void* operator

new(std::size_t, const std::nothrow_t&) throw

();void* operator

new(std::size_t, const std::nothrow_t&) throw

();void

operator delete(void*, const std::nothrow_t&) throw

();void

operator delete(void*, const std::nothrow_t&) throw

();//

placement operator new/delete

inline

void* operator

new(std::size_t, void* __p) throw()

inline

void* operator

new(std::size_t, void* __p) throw()

inline

void

operator delete (void*, void*) throw

() inline

void

operator delete(void*, void*) throw

() }

//extern "c++"

#endif

1、關於new operator與operator new

operator new() 僅僅分配記憶體空間,是對malloc的乙個封裝,返回的是乙個void *,如

int* a = (int *)::operator

new(sizeof(int));

只是對a分配了空間,通過vs2012進行除錯你會發現operator new 的實現如下:其主要是呼叫malloc(size),而沒有對記憶體進行初始化

void *__crtdecl operator

new(size_t size) _throw1(_std bad_alloc)

return

(p);

}

對於new operator先呼叫operator new分配記憶體空間,然後呼叫建構函式初始化

#include using

namespace

std;

class

foo

//對operator new進行重寫

void* operator

new(size_t size)

inta;

};int

main()

/***************

結果為:

3420040

foo operator new

foo constructor

10 ****************

*/

由於operator new 只是分配空間未呼叫建構函式,所以公有變數未初始化,是個隨機值,

而new foo() 先呼叫operator new 然後再建構函式,所以會先出現foo operator new

2、關於placement new(定位放置new)

placement new 是operator new的乙個過載的版本,如果你想在已經分配的記憶體中建立乙個物件,這時不能使用new。而placement new永許你在乙個已經分配好的記憶體中(棧或者堆中)構造乙個新的物件,原型中void* p實際就是指向乙個已經分配好的記憶體緩衝區的首位址。c++支援placement operator new,能夠在預先分配的緩衝區中構造物件,避免new記憶體分配時查詢記憶體和分配記憶體的時間,而且由於記憶體已經分配,沒有記憶體分配失敗的危險,在記憶體池,垃圾**器,和效能或異常安全可以使用

char *buf  = new

char[sizeof(string)]; //

pre-allocated buffer

string *p = new (buf) string("

hi"); //

placement new

char memory[sizeof

(foo)];

void* place =memory;

foo* f = new(place) foo();

3、關於set_new_handler

new_handler型別的函式是預設記憶體申請函式(operator new和operator new)申請記憶體失敗,會被呼叫。

new_handler函式會試圖為新的記憶體申請請求提供更多的可用空間。當且僅當,函式成功地提供了更多的可用空間,它才返回。

否則,要麼丟擲bad_alloc異常(或bad_alloc派生類)要麼終止程式(比如呼叫abort或exit)。

如果new_handler函式返回(即,它提供了更多可用空間)後,當記憶體申請函式申請指定的記憶體空間失敗時,它會被再次呼叫,或直到new_handle函式不返回或被替換。

#include #include 

char* memorypool =null;

void

my_new_handler()

else

return;}

intmain()

char *p =null;

for(int i = 0 ; i < 4; ++i)

return0;

}

c 中關於new語句

當我們使用關鍵字new在堆上動態建立乙個物件時,它實際上做了三件事 獲得一塊記憶體空間 呼叫建構函式 返回正確的指標。當然,如果我們建立的是簡單型別的變數,那麼第二步會被省略。舉個例子 a為某個類 a pa newa 3 那麼上述動態建立乙個物件的過程大致相當於以下三句話 只是大致上 a pa a ...

關於C 的new與override

先放出來兩個基類和派生類 public class baseclass public void method2 string desc public class derivedclass baseclass public newvoid method2 string desc new除了可以建立物件...

關於new命令

js中有一種說法,叫做一切皆為物件。物件是什麼呢?大話來講,物件是一種容器,裡面封裝了屬性和方法。在每天程式設計中,最基本的事情也是頻繁的幹的事情就是建立乙個物件,然後使用它幹各種各樣的事情。建立物件的方法有建構函式建立 語法糖建立 還有new命令建立。當然,本文的標題已經表明這次的主角是new關鍵...