placement new小结

正常情况下使用new运算符后会产生两个动作;1.调用operator new;2.调用构造函数

其中operator new的形式一般可解释如下,记得参数类型一定要为size_t,其内部就是调用了malloc分配内存。

static void* operator new(size_t size)
{
      ...
     void* ptr = (void*)malloc(size);
    return ptr;
}    

placement new可以理解为operator new这个函数有多于一个以上的参数时,将此版本的operator new称为placement new;

也有将第二个参数为void*时的operator new称为placement new ;都是术语问题不用管它;

effective c++ 第52条写了,有placement new 时必须对应写上它的 placement delete版本,因为当使用new运算符时如果第二步的构造函数出现异常,编译器就会自动调用placement delete将第一步分配出来的空间还回去,这样想是完全正确的,分配空间已经完成,但是调用构造函数为空间赋值时出异常,就得将空间还回去,但是在新版本的vs2013中却怎么也试不出来;

说了这么多还是讲讲比较c++自己实现的版本吧,毕竟平时应该很少会自己去重载placement new;    ps:能力有限,还是先算了吧,功力到了再研究

如果定义了一个带void*的placement new 其形式如下(实际上c++自己有定义这个函数)其行为就是将第二参数原封不动返回

placement new小结

 

 可以看到gcc下默认版本的placement new和placement delete是没干啥事情的;在搜索资料时有文章这样子使用了它;

http://www.cppblog.com/kongque/archive/2010/02/20/108093.html

https://www.cnblogs.com/xzlq/p/9504851.html

引用大佬原话:所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可。

placement new小结

 

 

先创建一块内存,然后使用默认的Foo* pfoo = new(buf)Foo;可分为两步1.调用placement new(这里就是简单返回了传入的buf)2.调用构造函数赋值(在这块buf上),感觉有点内存池的味道;new后的括号内()就是除第一个参数size_t外的内容,最后的那个Foo其实就是构造函数只不过这里没写所以用了默认的Foo()

cppreference上关于operator new和operator delete的说明很长,

https://en.cppreference.com/w/cpp/memory/new/operator_new

想看更多的使用技巧当然是看标准库啦;

当前我也不想去找,所以还是脚踏实地为好,关于这个话题就到此为止,如大佬们有更多的看法,欢迎指点

 

原文链接: https://www.cnblogs.com/Cxiangyang/p/13860523.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    placement new小结

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/204276

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午9:48
下一篇 2023年2月12日 下午9:48

相关推荐