1.经典例子
#include
#include
const
class
{
public
int
Foo(
private
int_val;
};
//预分配内存,但没有Foo对象
char*buf
int
main(
{
//在buf中创建一个Foo对象
Foo*pb
//检查一个对象是否被放在buf中
if
{
cout
}
//到这里不能再使用pb
delete[]
return
}
但我不了解这种“定位new表达式”相对于一般的new的优点是什么?它的用法比一般的new对象要复杂!
2.使用定位new表达式作用
new (place_address)type
new (palce_address) type(initializer-list)
place_address必须是个指针,指向已经分配好的内存。为了使用这种形式的new表达式,必须包含头文件<new>。
定位new表达式不能调用delete删除placementnew的对象,需要人为的调用对象的析构函数,并且人为的释放掉占用的内存。
#include <iostream> #include <new> using namespace std; const int chunk = 16; class Foo { public: int val(){return _val;} Foo(){_val=0;} private: int _val; }; int main() { // 预分配内存buf char *buf = new char[sizeof(Foo) * chunk]; // 在buf中创建一个Foo对象 Foo *pb=new (buf) Foo; // 检查一个对象是否被放在buf中 if(pb->val()==0) cout<<"new expression worked!"<<endl; // 这里不存在与定位new表达式匹配的delete表达式,即:delete pb, 其实只是为了 // 释放内存的话,我们不需要这样的表达式,因为定位new表达式并不分配内存。 // 如果在析构函数中要做一些其他的操作呢?就要显示的调用析构函数。 // 当程序不再需要buf时,buf指向的内存被删除,它所包含的任何对象的生命期也就 // 都结束了。 delete[] buf; return 0; }
定位new表达式的应用:
在我们的程序中,首先使用malloc为对象分配空间,然后通过定位new表达式将对象创建在已经被分配好的内存中,完成构造函数的调用。