关于C++的placement new和placement delete
来源:互联网 发布:海岛奇兵神庙升级数据 编辑:程序博客网 时间:2024/06/06 02:17
昨天发贴提了个问题,今天总结在这。原帖点击进入,有兴趣可以看看,我呆会儿还会说。
C++的new是语言自定义的操作符,这个操作符的行为包含两件事,而且你不能改变。
第一件事:调用operator new分配内存。所以通常说的重载new函数其实重载的是operator new,你无法重载new。
第二件事:调用你要new的对象的所属类的构造函数初始化第一步中分配的内存。这就是为什么你Object *pobj = new Object后,可以直接使用pobj->调用类中函数的原因。
delete操作符也是类似,不过先调用析构函数,然后释放内存,对应有一个operator delete。
帖子中的代码的目的是重载operator new和operator delete,把new和delete的历史通过一个ostream记录下来。好了,上代码了:
#include <iostream>using namespace std;class B{public: B(){cout << "ctor B" << endl;} ~B(){cout << "dtor B" << endl;} void * operator new(size_t size, ostream& out){ out << "new B" << endl; return ::operator new(size); } void operator delete(void *mem, ostream& out){ out << "delete B" << endl; ::operator delete(mem); }};int main(){ B *pb = new (cout)B; B *pb2 = ::new B; //delete pb; 这句编译不通过,说no suitable ‘operator delete’ for ‘B’ ::delete pb2;}
如果注释那段没问题,这段代码(期望)的输出是:
new Bctor Bctor Bdtor Bdelete Bdtor B
class B就不解释了,直接看main函数:
B *pb = new (cout)B; 这句new一个B的对象,因为B类中重载了operator new,所以需要传递一个ostream的对象进去,就像这样传递。如果你这样调用: B *pb = new B;那是会报错的,因为B类中的operator new把默认的隐藏掉了。这句产生输出:new B ctorB。
B *pb2 = ::new B; 这句也是new一个B的对象,但是new前面多了两个冒号,意思是调用全局的new,调用了上面说的被隐藏调的operator new。这句产生输出:ctor B。
delete pb; 这句想要delete掉pb指向的对象,但是失败,原因在后面。这句(期望)输出:dtor B delete B。
::delete pb2; 这句delete掉pb2指向的对象,调用全局的delete,没有问题,这句输出:dtor B。
关于delete pb为什么失败:
2楼 RabbitLBJ:
先说声楼主最好还是把new,delete声明称static好些把出错的行改成如下B::operator delete(pb,cout);即可调用到placement delete了,但是想法和楼主的有差距,这函数里面直接释放内存,就不会再析构了貌似这个delete是不能通过delete关键字在外面调用的,这个一般都是给系统在placement new出错时调用而且只要有使用placement new,析构一般都是要手动进行的
4楼 pengzhixi:
c++为什么没有内置的"placement new"是因为 没办法提供一个通用的。B *pb = new (cout)B;当我们写出这样的代码的时候,c++不能推出pb指针里面存放的对象类型。(虽然我们知道是什么类型)。所以不会有placement delete.只有在placement new抛出异常的时候,编译器才会调用placement delete.这个时候因为构造不成功所以只需要负责释放内存即可。所以LZ只能是先显示调用析构函数,然后在显示调用placement delete.另外:不要重载operator new operator delete这些东西。
这两位朋友解释的很清楚了,我就不画蛇添足了,在此感谢这两位朋友的解答。
Reference:
Scott Meyers. Effective C++ 3rd edition. 2005
Scott Meyers. More Effective C++ . 1996
- 关于C++的placement new和placement delete
- 关于new delete和placement new,placement delete
- placement new和placement delete
- placement new和placement delete
- placement new和placement delete(重载new和delete2)
- operate new、delete new和placement new
- 关于operator new及placement new,和相关的delete重载
- placement new和placement delete跟踪内存分配
- C++ 的 new 和 delete : new operator, operator new, placement new, delete operator, operator delete
- C++中placement new和delete讨论
- 写了placement new也要写placement delete
- 关于placement new
- 关于placement new
- 关于placement new
- 关于placement new操作
- c++placement new
- 浅谈c++placement new
- About placement new and delete
- Revit 编程获取墙侧面的两种方法
- poj 3250 Bad Hair Day
- 设计自己的Annotation实现方法的鉴权
- ROR (二)
- solaris7下为用户打开ftp服务
- 关于C++的placement new和placement delete
- 收藏一下,虽然很多东西还没接触到
- 一道面试题,对一个数组进行排序,第一个最大,第二个最小,第三个次大,一次类推
- Java EE连接SQL Servet 2008的时遇到的一些问题及解决方法
- 算法的时间复杂度分析
- 计算
- 黑马程序员——IO流总结之一
- MySQL学习笔记(四)性能优化2
- joomla