c++学习 定位new表达式

C++ 专栏收录该内容
39 篇文章 1 订阅
转自:http://www.cnblogs.com/weiweiqiao99/archive/2012/06/16/2545710.html

在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行的实例化在第二个“位置”,两者之间没有重叠处

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值