c++placement new

初次接触到placement new,在在看安卓的audio模块代码,代码片段如下 :

    // construct the shared structure in-place.
    if (mCblk != NULL) {
        new(mCblk) audio_track_cblk_t();
        // clear all buffers
        mCblk->frameCount_ = frameCount;
        if (sharedBuffer == 0) {
            mBuffer = (char*)mCblk + sizeof(audio_track_cblk_t);
            memset(mBuffer, 0, bufferSize);
        } else {

            mBuffer = sharedBuffer->pointer();

tracks.cpp at 150 to 159 line.

看了半天也不知道 new(mCblk) audio_track_cblk_t() 是什么意思,后来查资料才知道,这是c++的placement new,在已经分配的内存区域上新建对象的一种方式。

class MyClass {
      public MyClass(para){};
	.
	.
	.
  }; 

1.new operator,new操作符。从堆中分配一个对象并且初始化。

MyClass *p=new  MyClass(para);

跟其他操作符比如+ ,-,*,/ 一样,是由c++语言定义的,不能改变不能重载。

new操作符实际上执行如下3个过程:

(1).调用operator new 分配内存

(2).调用构造函数初始化类对象

(3).返回相应指针


2.operator new ,new操作符的第一个功能。全局的new操作声明如下:

void * operator new(size_t size);

这是一个函数声明,在c++内部可以通过函数重载改变这个函数的功能,可以根据实际的需求改变分配空间的方式。

void *p =operator new(bufferSize);

 只是分配了一个大小为buffersize的内存,等同于c里面的malloc


3.placement new,在已经分配好的空间上,创建一个指定的对象

eg: void *buffer = operator new(1024);

MyClass * creat(void *buffer,para)

{

return new(buffer) MyClass(para);   //创建时手动调用构造函数,释放时手动调用析构函数。

}


参考博客:

http://blog.csdn.net/wudaijun/article/details/9273339

http://www.cnblogs.com/younes/archive/2010/04/26/1721528.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值