文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>区分new , operator new, placement new

区分new , operator new, placement new

时间:2010-12-13  来源:yezizhe

CA表示一个类,那上面的代码就算是生成一个CA的对象,也就是执行new的操作。new是一个操作符,它的过程分为两步,首先从堆中分配一个对象,然后调用构造函数进行初始化,用代码写出来就是下面这样:

CA *pa = operator new(sizeof(CA))     //相当于malloc,实际可以这样子调用

pa.pa()                                                //构造函数,实际没办法这样调用

我们看到operator new, 它是用来向系统申请内存空间的,即上面所说的new操作的第一步,相当于c语言的malloc操作。所以可以通过重载operator new实现自定义的内存分配方案,包括全局的operator new和类里面的operator new,这也是内存池实现的基础。简单说当使用new操作符,它首先调用operator new分配空间,再调用构造函数。

 

再看下一个例子:

void* buffer=operator new(100*sizeof(CA));///分配100个对象的空间

CA  *pa = new(buf) CA;

上面是placement new的用法:用来在已经分配好的内存空间建立一个对象,可以免去分配内存的时间消耗,接着调用构造函数。比如上面例子,在buf地址创建一个CA的对象,而buf已经是分配好的内存空间,这也是跟new不同的地方,然后会自动调用其构造函数。注意的是删除对象时候,应该调用pa.~CA() ,不能进行delete pa操作。因为pa的内存空间实际上是buffer申请分配的,而pa对象是指使用了那块内存,因此只需要手动把pa析构即可,而真正的内存空间应该交给buffer进行处理,既delete buffer,把内存释放给系统。

相关阅读 更多 +
排行榜 更多 +
野生恐龙射击生存安卓版

野生恐龙射击生存安卓版

飞行射击 下载
战场狙击手

战场狙击手

飞行射击 下载
1v1布娃娃射击安卓版

1v1布娃娃射击安卓版

飞行射击 下载