place new所謂何解?-構造和析構基本工具

來自stl_construct.h文件 
template   <class   T1,   class   T2> 
inline   void   construct(T1*   p,   const   T2&   value)   { 
new   (p)   T1(value);   //這一行的語法該怎麼理解? 
} 
而下面的析構函數是 
template   <class   T> 
inline   void   destroy(T*   pointer){ 
pointer-> ~T();       //這一行我還能理解. 
}

回答:

new   placement 數組

你能夠簡單的理解爲C中的realloc,就是在已有空間的基礎上,從新分配一個空間,能夠不破壞原來數據,也能夠把數據所有用新值覆蓋 

一下是我搜集的一些筆記 
若是你想在預分配的內存上建立對象,用缺省的new操做符是行不通的。要解決這個問題,你能夠用placement   new構造。它容許你構造一個新對象到預分配的內存上: 

//   buffer   是一個void指針   (void   *) 

//   用方括號[]   括起來的部分是可選的 

[CYourClass   *   pValue   =   ]   new(   buffer)   CYourClass[(   parameters)]; 

下面是一些例子: 

#include   <new 

class   CTest 



public: 

CTest() 

{} 

CTest(   int) 

{} 

/*   代碼*/ 

}; 

int   main(int   argc,   char*   argv[]) 



//   因爲這個例子的目的,咱們不考慮內存對齊問題 

char   strBuff[   sizeof(   CTest)   *   10   +   100]; 

CTest   *   pBuffer   =   (   CTest   *)strBuff; 

//   缺省構造 

CTest   *   pFirst   =   new(pBuffer)   CTest; 

//   缺省構造 

CTest   *   pSecond   =   new(pBuffer   +   1)   CTest; 

//   帶參數的構造; 

//   不理會的指針 

new(pBuffer   +   2)   CTest(   5); 

//   帶參數的構造 

CTest   *   pFourth   =   new(   pBuffer   +   3)   CTest(   10); 

//   缺省構造 

CTest   *   pFifth   =   new(pBuffer   +   4)   CTest(); 

//   構造多個元素(缺省構造) 

CTest   *   pMultipleElements   =   new(pBuffer   +   5)   CTest[   5]; 

return   0; 



當你有本身的內存緩衝區或者在你實現本身的內存分配策略的時候,placement   new會頗有用。事實上在STL中普遍使用了placement   new來給容器分配內存;每一個容器類都有一個模版參數說明了構造/析構對象時所用的分配器(allocator)。 

在使用placement   new的時候,你要記住如下幾點: 

加上頭文件#include   <new   你能夠用placement   new構造一個數組中的元素。   要析構一個用placement   new分配的對象,你應該手工調用析構函數(並不存在一個「placement   delete」)。它的語法以下: 

pFirst-~CTest(); 

pSecond-~CTest(); 

//.   .   .   等等函數

2.佈局

T1   *pT1   =   new(p)   T1(value);     //在p所指的內存空間中 構造一個新T1類的實例。即placement   new. 

spa

在這種用法中,析構對象經過顯式調用其析構函數: PT1-> ~T1(   );     每每不用delete   pT1.內存的釋放由對p來操做完成。指針

3.code

《More   Effective   C++》     Item   M8:理解各類不一樣含義的new和delete   中講的很透徹。定位new或者佈局new對象

相關文章
相關標籤/搜索