C 中需要(或禁止)对象产生于heap中
2008-02-23 05:24:16来源:互联网 阅读 ()
考虑如下代码:
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(){} }; |
这确实是比较简单的事情。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 小心C 编译器给我们带来的麻烦
下一篇: 360度全方位比较 c# 和 VB
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash