
C++中要求(或禁止)对象产生于heap中
发布时间:2006-06-24 12:19:46 来源:blog 网友评论 0 条
要求对象产生于Heap之中
考虑如下代码:
这样的调用真是很厉害,想生成非Heap对象都不成了。
对于继承和组合的情况不想多说了,比较无趣的说。
判断某个对象是否位于Heap内
考虑如下代码:
你觉得编译器应该怎么做?
1.调用operator new
2.调用Constructor
3.调用第二个operator new
4.调用第二个Constructor
但是可以让人足够惊讶,编译器对此并不做承诺,所以实际的实现可能是:
1.调用operator new
2.调用第二个operator new
3.调用Constructor
4.调用第二个Constructor
而VC6是这样实现的。
我在VC6中写了这个Demo测试了一下,但是const void * rawAddress = dynamic_cast<const void *>(this);会出现异常,这让我觉得很郁闷,所以这个Demo只能支持普通的继承方式,不支持多种继承和虚拟继承。
禁止对象产生于heap之中
考虑如下代码:
这确实是比较简单的事情。
考虑如下代码:
| classHeapClass { public: voidDestory() const {deletethis;} private: ~HeapClass(){} }; HeapClass* ptr = newHeapClass; ptr->Destory(); |
这样的调用真是很厉害,想生成非Heap对象都不成了。
对于继承和组合的情况不想多说了,比较无趣的说。
判断某个对象是否位于Heap内
考虑如下代码:
| newHeapClass(* newHeapClass); |
你觉得编译器应该怎么做?
1.调用operator new
2.调用Constructor
3.调用第二个operator new
4.调用第二个Constructor
但是可以让人足够惊讶,编译器对此并不做承诺,所以实际的实现可能是:
1.调用operator new
2.调用第二个operator new
3.调用Constructor
4.调用第二个Constructor
而VC6是这样实现的。
| classHeapClass { private: void* operatornew[](size_tsize); typedefconstvoid * RawAddress; voidoperatordelete[](void* ptr); public: voidoperatordelete(void *ptr) { printf("delete/n"); ::operatordelete(ptr); m_address.erase(std::remove(m_address.begin(),m_address.end(),ptr),m_address.end()); return; } void* operatornew(size_tsize) { printf("new/n"); void * ptr = ::operatornew(size); m_address.push_back(ptr); returnptr; } HeapClass() { printf("Constructor!/n"); } HeapClass(constHeapClass&) { printf("copy Constructor!/n"); } virtualvoidDestory() const {deletethis;} virtual ~HeapClass() = 0; boolisOnHeap() const { // const void * rawAddress = dynamic_cast<const void *>(this); constvoid * rawAddress = (constvoid *)(this); std::deque<RawAddress>::iteratoriter = std::find(m_address.begin(),m_address.end(),rawAddress); returniter != m_address.end(); } private: staticstd::deque<RawAddress> m_address; }; HeapClass::~HeapClass(){} std::deque<HeapClass::RawAddress> HeapClass::m_address; classDHeapClass:publicHeapClass {}; |
我在VC6中写了这个Demo测试了一下,但是const void * rawAddress = dynamic_cast<const void *>(this);会出现异常,这让我觉得很郁闷,所以这个Demo只能支持普通的继承方式,不支持多种继承和虚拟继承。
禁止对象产生于heap之中
考虑如下代码:
| classHeapClass { private: void* operatornew(size_tsize); void* operatornew[](size_tsize); voidoperatordelete(void *ptr); voidoperatordelete[](void* ptr); public: HeapClass(){printf("Constructor!/n");} HeapClass(constHeapClass&){printf("copy Constructor!/n");} public: ~HeapClass(){} }; |
这确实是比较简单的事情。
推荐阅讯
- 浅谈C/C++内存泄漏及其检测工具
- C/C++程序员应聘常见面试题深入剖析
- C++箴言:理解inline化的介入和排除
- VC++中利用磁盘序列号识别正版软件
- C++的iostream标准库介绍
- Windows Sockets:带存档的套接字的工作方式
- Windows Sockets 示例列表
- More Effective C++:不要重载的操作符
- 利用VC++实现局域网实时视频传输
- c++类静态数据成员与类静态成员函数
阅读排行
- 1.Borland 发布C++ Builder 2006 RAD 环境
- 2.C/C++程序员应聘常见面试题深入剖析
- 3.Visual C++常用数据类型转换详解
- 4.C++中的 static 关键字
- 5.利用VC++实现局域网实时视频传输
- 6.浅谈C/C++内存泄漏及其检测工具
- 7.英国投票否决C++/CLI 微软强攻ISO标准受挫
- 8.VC++下用MSComm控件实现串口通讯
- 9.伪随机数生成及在VC++中的实现
- 10.VC++编程实现对波形数据的频谱分析
专题教程
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
- Picasa中文版_Picasa教程 专题:清除流氓软件
- Firefox专题 seo搜索引擎优化专区
- 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
