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. 

在这种用法中,析构对象通过显式调用其析构函数: PT1-> ~T1(   );     往往不用delete   pT1.内存的释放由对p来操作完成。

3.

《More   Effective   C++》     Item   M8:理解各种不同含义的new和delete   中讲的很透彻。定位new或者布局new

你可能感兴趣的:(place new所谓何解?-构造和析构基本工具)