在cpp中,new主要有3種用法:實例化一個對象;實例化一個數組;定位new表達式。在這里主要討論第三種用法,定位new表達式。
定位new表達式,就是在內存中new一塊地址,然后根據程序的需要,將大小適合的實例對象放到此內存塊中操作的方法。在此我借用《cpp primer 3rd》中p347中的例子給予說明,不足之處,懇請各位讀者斧正。
首先創建測試用的類Foo
1 //測試所用的類 2 class Foo 3 { 4 public: 5 Foo(int val = 0) 6 { 7 _val = val; 8 } 9 10 void writeFoo() 11 { 12 cout<< "_val is " << _val << "wook"; 13 cout<< endl; 14 } 15 16 private: 17 int _val; 18 };
我們看到Foo有一個private對象_val;有一個打印到console的方法writeFoo。
然后是main函數。
1 int main(int argc, char *argv[]) 2 { 3 QCoreApplication a(argc, argv); 4 5 //創建char數組,大小為3個Foo 6 char* buf = new char[sizeof(Foo) * 3]; 7 8 //sizeof(Foo)大小為4 9 //cout<< sizeof(Foo) << endl; 10 11 12 //實例化Foo對象,並將其放置到buf中第一個Foo“位置”處 13 Foo* pb = new (buf) Foo(0); 14 15 //cout<< pb << endl; 16 pb->writeFoo(); 17 18 //實例化Foo對象,並將其放置到buf中第二個Foo“位置”處 19 Foo* pb3 = new (buf + (sizeof(Foo) * 2)) Foo(2); 20 21 //實例化Foo對象,並將其放置到buf中第一個Foo的“第二個位置處” 22 //Foo* pb3 = new (buf + ((sizeof(Foo) * 2) -3)) Foo(2); 23 24 //cout<< pb3 << endl; 25 pb3->writeFoo(); 26 //cout<< *(buf + ((sizeof(Foo) * 2) - 3)) << endl; 27 28 Foo* pb1 = new (buf + sizeof(Foo)) Foo(1); 29 30 //cout<< *(buf + sizeof(Foo)) << endl; 31 32 /*cout<< "*************" << endl; 33 cout<< *(buf + ((sizeof(Foo) * 2) - 3)) << endl; 34 cout<< "*************" << endl;*/ 35 36 /*for (int index(0); index != (sizeof(Foo) * 3); index++) 37 { 38 cout<< "********* " << index << endl; 39 cout<< *(buf + index) << endl; 40 cout<< "*********" << endl; 41 }*/ 42 43 //cout<< pb1 << endl; 44 pb1->writeFoo(); 45 pb3->writeFoo(); 46 47 48 //cout<< pb3 << endl; 49 //cout<< pb1 << endl; 50 //cout<< pb3 << endl; 51 52 //pb3->writeFoo(); 53 54 return a.exec(); 55 }
16/25/44/45四行的輸出為:
1 _val is 0wook 2 _val is 2wook 3 _val is 1wook 4 _val is 2wook
由此可見因為19行的實例化在第三個Foo的“位置”,第28行的實例化在第二個“位置”,兩者之間沒有重疊處。
未完!