前言
placement new是用来在指定的内存上创建对象,而不是直接在堆栈上创建对象。好处就字然不用多说,一方面避免了大内存申请失败的情况,另一方面对那些效率要求严格的场景也有了改善
正文
既然是在指定的内存上创建对象,那么这块内存又是如何被创建出来的?我们来看这块缓冲内存的创建方式
缓冲内存的创建方式
*栈区. class CTest; char szBuff[ N * sizeof(CTest) ];
*堆区. char *pBuff = new [ N * sizeof(CTest) ]; 请注意auto或者static内存并非都正确地为每一个对象类型排列,所以,你将不能以placement new使用它们 (1)
*直接使用地址转换(确保地址是合法有效的). void *pBuff = reinterpre_cast(0x345678);
把缓冲区内存创建完毕后,我们就在这段内存上创建对象
对象的创建
CTest *pTest = new(pBuff) CTest;
创建完成后就可以按照普通的类对象使用它,如pClass->printObjectName();
对象的析构
析构的时候有点不同,需要如此析构:pTest->~CTest(); 这样表示调用外在的析构函数
缓冲内存的释放
使用完这块缓冲内存后,释放时delete pB