C++ 内存基本构件 placement new

199 阅读1分钟

用法以及编译器解释

placement new 允许我们将object构建于已经分配的内存上。(所以此时必须有个指针指向已经分配好的内存)
没有所谓的placement delete ,因为placement new根本没有分配内存.
也有种说法,是将placement new对应的内存释放掉的操作为placement delete。

char* buf = new char[sizeof(Complex)*3];
Complex* pc = new(buf)Complex(1,2);	//将对象分配在已经分配好的内存buf上
...
delete [] buf;

被编译器转为:

Complex *pc;
try{
	1void mem = operator new(sizeof(Complex),buf);	//在顶点内存
	2、pc = static_cast<Complex*>(mem);					//转型
	3、pc->Complex::Complex(1,2);						//调用构造函数
}
catch(std::bad_alloc){
	//若allocation失败就不执行构造函数
}

pc、buf指向同一个地方。
在这里插入图片描述
关于operator new,此处用的函数与之前提到的函数有点不一样:blog.csdn.net/qq_42604176…
这里的用法为:
在这里插入图片描述
你传递分配好的内存给它,它什么都没做,将地址返回。
于是我们可以总结,placement new就是调用了构造函数。
注意,这三种写法是一致的:
在这里插入图片描述