在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行的实例化在第二个“位置”,两者之间没有重叠处。
时间: 2024-10-11 06:39:59