More Effective C++之27

原创 2006年06月23日 17:22:00
条款27:要求(或禁止)对象产生于heap之中
要求对象产生于Heap之中 Heap-Based Objects
       考虑如下代码:
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(){}
};
这确实是比较简单的事情。

《More Effective C++》条款27:如何让类对象只在栈(堆)上分配空间?

昨天一个同学去网易面试C++研发,问到了这么一个问题:如何限制一个类对象只在栈(堆)上分配空间? 一般情况下,编写一个类,是可以在栈或者堆分配空间。但有些时候,你想编写一个只能在栈或者只能在堆上面分...
  • hxz_qlh
  • hxz_qlh
  • 2013年10月26日 21:27
  • 6093

《More Effective C++》读书笔记-技术

25、将构造函数和非成员函数虚化1、这里所谓的虚拟构造函数,并不是真的指在构造函数前面加上 virtual 修饰符,而是指能够根据传入不同的参数建立不同继承关系类型的对象。class NLCompon...
  • will130
  • will130
  • 2016年05月02日 12:27
  • 2794

《Effective C++》和《More Effective C++》汇总

More Effective C++读书笔记 条款1:指针与引用的区别 二者之间的区别是:在任何情况下都不能用指向空值的引用,而指针则可以;指针可以被重新赋值以指向另一个不同的对象,但...
  • zhu2695
  • zhu2695
  • 2013年06月22日 20:29
  • 2033

More Effective C++ 读书摘要(目录索引)

一、基础议题 Item 1. 区分指针和引用Item 2. 优先考虑C++风格的类型转换Item 3. 决不要把多态用于数组Item 4. 避免不必要的默认构造函数二、运算符Item 5. 小心用户自...
  • thy38
  • thy38
  • 2009年04月26日 10:23
  • 1308

《Effective C++》:条款28-条款29

条款28避免返回handles指向对象内部成分:指的是不能返回对象内部数据/函数的引用、指针等。 条款29为异常安全而努力是值得的:指的是要有异常处理机制,避免发生异常时造成资源泄露等问题。...
  • KangRoger
  • KangRoger
  • 2015年02月19日 19:47
  • 1395

《More Effective C++》读书笔记-异常

9、利用destructors 避免泄漏资源使用指针时,如果在delete指针之前产生异常,将会导致不能删除指针,从而产生资源泄漏。解决办法: 1、使用try-catch语句。int *pi = n...
  • will130
  • will130
  • 2016年04月30日 19:24
  • 277

More Effective C++学习笔记(4)-效率

主题 概要 C++ More Effective C++ 效率 编辑 时间 新建 20170121 序号 参考资料 1 More ef...
  • shaozhenged
  • shaozhenged
  • 2017年01月21日 20:23
  • 403

more effective c++--引用计数

引用计数是这样一个技巧,它允许多个有相同值的对象共享这个值的实现。这个技巧 有两个常用动机。第一个是简化跟踪堆中的对象的过程。一旦一个对象通过调用 new 被分配 出来,最要紧的就是记录谁拥有这个对象...
  • xdgs_2005
  • xdgs_2005
  • 2015年04月05日 14:22
  • 370

Effective C++: scott Meyers的几句话

前几天,慕名买了一本关于C++的一本书, 即Scott Mey
  • a130737
  • a130737
  • 2014年07月31日 13:21
  • 517

More Effective C++----技巧 & (25)将构造函数和非成员函数虚拟化

技巧 本书涉及的大多数内容都是编程的指导准则。这些准则虽是重要的,但是程序员不能单靠准则生活。有一个很早以前的卡通片叫做“菲利猫”(Felix the Cat), 菲利猫无论何时遇到困难,它都会拿...
  • qianqin_2014
  • qianqin_2014
  • 2016年05月06日 23:30
  • 2488
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:More Effective C++之27
举报原因:
原因补充:

(最多只允许输入30个字)