c++学習位置決めnew式

9590 ワード

cppではnewには主に3つの用法がある:1つのオブジェクトをインスタンス化する;配列をインスタンス化します.new式を位置決めします.ここでは主に第3の用法,位置決めnew式について議論する.
new式を位置決めすることは、メモリ内のnewアドレスをnewし、プログラムの必要に応じて適切なサイズのインスタンスオブジェクトをこのメモリブロックに配置して操作する方法です.ここでは『cpp primer 3 rd』のp 347の例を借りて説明しますが、不足点は、読者の皆さんに斧正をお願いします.
まずテスト用のクラス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 4行の出力:
1 _val is 0wook

2 _val is 2wook

3 _val is 1wook

4 _val is 2wook

このことから,19行目のインスタンス化は3番目のFooの「位置」にあり,28行目のインスタンス化は2番目の「位置」にあり,両者の間に重複はないことが分かる.
 
未完!