placement new 用法

来源:互联网 发布:淘宝聊天工具怎么下载 编辑:程序博客网 时间:2024/06/06 13:08

1、功能

placemen new在固定的内存地址申请一段内存并返回该类型指针,我的理解是把一段内存解释为一个定义的类型。

 char buff[100];

class Type;

Type*p= new(buff)Type;

和普通new一样会调用该类型的构造函数(如果是非内置类型数据)。

从我的测试情况来看,buff内存大小应该不小于sizeof(Type),否则也许运行时异常。

new以后一定要显示调用Type所对应的析构函数。

1、placement new适用情况

      当用普通new时对系统开销比较大的情况下,可以用placement new,这样,在动态分配内存的时候不用去查询系统内存占用情况,提高运行效率。

2、placement new用法

开辟内存方法:

a:可以用malloc 或者 new动态申请一段内存;

如 class Type; char* buffer = new char[sizeof(Type)];

如果buffer不用以后要释放buffer;

b:利用栈上空间;

如 class Type; char buffer[sizeof(Type)];

此时不需要释放buffer,要注意此buffer的作用域及生命周期。

c:利用固定内存地址

如:char* buffer = 0x00120033;

 

应该也许比较常用的还是a和b。

记得显示调用placement new申请的内存返回指针所指的析构函数。

 

暂时就这,以后可能有补充。

 

代码:


#include <stdio.h>
#include <string>

using namespace std;

class TestStruct
{
public:

 TestStruct():m_ea(1)
 {
  printf("TestStruct Constructor\n");
 }
 ~TestStruct()
 {
  printf("TestStruct DeConstructor\n");
 }

 class InnerClass
 {
 public:
  InnerClass():m_ina(10)
  {
   printf("InnerClass Constructor\n");
  }
  ~InnerClass()
  {
   printf("InnerClass DeConstructor\n");
  }
  int m_ina;
 };

public:
 int m_ea;
 InnerClass m_innerClass;
 string m_str;
 char m_data[10];
};

static char* g_pStr = "11000000000000000000000000000000000000111111111111";

struct TestS
{
 int a;
 char m_data[sizeof(TestStruct)];
};

int main(int argc, char* argv[])
{
 TestS s;
 TestS tsa[2];
 TestStruct* p1 = new(s.m_data) TestStruct;

 TestStruct t1;
 t1.m_str = g_pStr;
 t1.m_innerClass.m_ina = 1001;
 memset(t1.m_data, 'a', sizeof(t1.m_data));
 t1.m_ea = 500001;

 *p1 = t1;

 //tsa[0] = s; 赋值以及memcpy皆可
 memcpy(&tsa[0], &s, sizeof(s));
 //p1->~TestStruct();//这里不能调用析构函数
 TestStruct* p2 = (TestStruct*)tsa[0].m_data;
 p2->~TestStruct(); //彻底不用以后才调用析构函数
 return 0;
}

 

原创粉丝点击