欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

new placement

发布时间:2024/5/15 编程问答 31 豆豆
生活随笔 收集整理的这篇文章主要介绍了 new placement 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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();

//.   .   .   等等

总结

以上是生活随笔为你收集整理的new placement的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。