來自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對象