正常情况下使用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
想看更多的使用技巧当然是看标准库啦;
当前我也不想去找,所以还是脚踏实地为好,关于这个话题就到此为止,如大佬们有更多的看法,欢迎指点