c++学习 定位new表达式

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


转载于:https://my.oschina.net/weiweiqiao/blog/484207

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值