c++學習 定位new表達式


在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行的實例化在第二個“位置”,兩者之間沒有重疊處。

 

未完!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM