• 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++自己有定义这个函数)其行为就是将第二参数原封不动返回

     可以看到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就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可。

    先创建一块内存,然后使用默认的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

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

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

  • 相关阅读:
    Trades FZU
    H
    Coconuts HDU
    初始化Linux数据盘、磁盘分区、挂载磁盘(fdisk)
    虚拟机硬盘vmdk压缩瘦身并挂载到VirtualBox
    docker创建tomcat容器无法正常访问
    centos7一步一步搭建docker tomcat 及重点讲解
    docker配置国内阿里云镜像源
    代理模式(2):动态代理
    代理模式(1):静态代理
  • 原文地址:https://www.cnblogs.com/Cxiangyang/p/13860523.html
Copyright © 2020-2023  润新知