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;
}