C++ “让new操作符不分配内存,只调用构造函数”
2019-10-06 本文已影响0人
微糖去冰_
问题
c++中的new操作符 通常完成两个工作 分配内存及调用相应的构造函数。
请问:
1)如何让new操作符不分配内存,只调用构造函数?
2)这样的用法有什么用?
placement new的含义
placement new可以实现不分配内存,只调用构造函数。
void *operator new( size_t, void *p ) throw() { return p; }
placement new的执行忽略了size_t参数,只返还第二个参数。
其结果是允许用户把一个对象放到一个特定的地方,达到调用构造函数的效果。
用法如下:
#include <iostream>
#include <new>
class Test
{
public:
Test()
{
std::cout << "Constructor" << std::endl;
};
~Test()
{
std::cout << "Destructor" << std::endl;
}
private:
char mA;
char mB;
};
char* gMemoryCache = (char *)malloc(sizeof(Test));
int main()
{
{
Test* test = new(gMemoryCache) Test();
}
{
Test* test = new(gMemoryCache) Test();
test->~Test();
}
}
输出:
Constructor
Constructor
Destructor
和其他普通的new不同的是,它在括号里多了另外一个参数。比如:
Widget * p = new Widget; - - - - - - - - - //ordinary new
pi = new (ptr) int; pi = new (ptr) int; //placement new
括号里的参数ptr是一个指针,它指向一个内存缓冲器,placement new将在这个缓冲器上分配一个对象。
Placement new的返回值是这 个被构造对象的地址(比如括号中的传递参数)。
placement new主要适用于:在对时间要求非常高的应用程序中,因为这些程序分配的时间是确定 的;长时间运行而不被打断的程序;以及执行一个垃圾收集器 (garbage collector)。