最近无意中看到一段代码,感觉很有趣,和大家分享一下。
#include <iostream>
class A{};
void f()
{
char buf[sizeof(A)];
new (buf)A();
}
int main()
{
f();
return 1;
}
代码可以看出,f()中在栈上申请了一块sizeof(A)大小的内存,new (buf)A(); 这句代码其实是重载operator new 操作符,意思是:在buf这个首地址调用构造函数但不并不申请内存。所以当f()调用结束时,栈上的内存被释放,但是并没有调用A的析构函数。
这里有两个地方需要注意:1> buf的空间不能小于A的空间,否则new调用失败。如果是对数组的操作,需要多预留sizeof(int)的空间,用来存储数组大小。2> 如果申请的空间分配在堆上,需要调用delete[] buf;来释放内存空间,防止内存泄漏。
适用场合:需要反复申请内存释放内存的地方,比如内存池,placement new 操作符可以节省分配内存的开销,从而提升一定的效率。