在 cpp 中,new 主要有 3 种用法:实例化一个对象;实例化一个数组;定位 new 表达式。在这里主要讨论第三种用法,定位 new 表达式。
定位 new 表达式,就是在内存中 new 一块地址,然后根据程序的需要,将大小适合的实例对象放到此内存块中操作的方法。在此我借用《cpp primer 3rd》中 p347 中的例子给予说明,不足之处,恳请各位读者斧正。
首先创建测试用的类 Foo
//测试所用的类
class Foo
{
public:
Foo(int val = 0)
{
_val = val;
}
void writeFoo()
{
cout<< "_val is " << _val << "wook";
cout<< endl;
}
private:
int _val;
};
我们看到 Foo 有一个 private 对象_val;有一个打印到 console 的方法 writeFoo。
然后是 main 函数。
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//创建char数组,大小为3个Foo
char* buf = new char[sizeof(Foo) * 3];
//sizeof(Foo)大小为4
//cout<< sizeof(Foo) << endl;
//实例化Foo对象,并将其放置到buf中第一个Foo“位置”处
Foo* pb = new (buf) Foo(0);
//cout<< pb << endl;
pb->writeFoo();
//实例化Foo对象,并将其放置到buf中第二个Foo“位置”处
Foo* pb3 = new (buf + (sizeof(Foo) * 2)) Foo(2);
//实例化Foo对象,并将其放置到buf中第一个Foo的“第二个位置处”
//Foo* pb3 = new (buf + ((sizeof(Foo) * 2) -3)) Foo(2);
//cout<< pb3 << endl;
pb3->writeFoo();
//cout<< *(buf + ((sizeof(Foo) * 2) - 3)) << endl;
Foo* pb1 = new (buf + sizeof(Foo)) Foo(1);
//cout<< *(buf + sizeof(Foo)) << endl;
/*cout<< "*************" << endl;
cout<< *(buf + ((sizeof(Foo) * 2) - 3)) << endl;
cout<< "*************" << endl;*/
/*for (int index(0); index != (sizeof(Foo) * 3); index++)
{
cout<< "********* " << index << endl;
cout<< *(buf + index) << endl;
cout<< "*********" << endl;
}*/
//cout<< pb1 << endl;
pb1->writeFoo();
pb3->writeFoo();
//cout<< pb3 << endl;
//cout<< pb1 << endl;
//cout<< pb3 << endl;
//pb3->writeFoo();
return a.exec();
}
16/25/44/45 四行的输出为:
1 _val is 0wook
2 _val is 2wook
3 _val is 1wook
4 _val is 2wook
由此可见因为 19 行的实例化在第三个 Foo 的 “位置”,第 28 行的实例化在第二个 “位置”,两者之间没有重叠处。