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 *)::operatornew(sizeof(int));
只是對a分配了空間,通過vs2012進行除錯你會發現operator new 的實現如下:其主要是呼叫malloc(size),而沒有對記憶體進行初始化
void *__crtdecl operatornew(size_t size) _throw1(_std bad_alloc)
return
(p);
}
對於new operator先呼叫operator new分配記憶體空間,然後呼叫建構函式初始化
#include usingnamespace
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 = newchar[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 #includechar* 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關鍵...