C++中要求(或禁止)对象产生于heap中

要求对象产生于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
");
    ::operatordelete(ptr);
    m_address.erase(std::remove(m_address.begin(),m_address.end(),ptr),m_address.end());
    return;
   }
   void* operatornew(size_tsize)
   {
    printf("new
");
    void * ptr = ::operatornew(size);
    m_address.push_back(ptr);
    returnptr;
   }
   HeapClass()
   {
    printf("Constructor!
");
   }
   HeapClass(constHeapClass&)
   {
    printf("copy Constructor!
");
   }
   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!
");}
   HeapClass(constHeapClass&){printf("copy Constructor!
");}
  public:
   ~HeapClass(){}
};


这确实是比较简单的事情。

时间: 2024-09-16 01:54:07

C++中要求(或禁止)对象产生于heap中的相关文章

SpringMVC中通过@ResponseBody返回对象,Js中调用@ResponseBody返回值,统计剩余评论字数的js,@RequestParam默认值,@PathVariable的用法

1.SpringMVC中通过@ResponseBody返回对象,作为JQuery中的ajax返回值 package com.kuman.cartoon.controller;   import java.util.Map;   import javax.servlet.http.HttpServletRequest;   import org.apache.commons.io.filefilter.FalseFileFilter; import org.slf4j.Logger; import

JavaScript中的Window窗口对象_基础知识

JavaScript中的Window窗口对象 他是JavaScript中最大的对象,它描述的是一个浏览器窗口.一般要引用它的属性和方法时,不需要用"window.xxx"这种形式,而直接使用"xxx".一个框架页面也是一个窗口. Window窗口对象有如下属性: name 窗口的名称,由打开它的连接(<a target="...">)或框架页(<frame name="...">)或某一个窗口调用的 o

link中如何获得迭代对象的全部属性?需要发射么?

问题描述 link中如何获得迭代对象的全部属性?需要发射么? link中如何获得迭代对象的全部属性?需要发射么? 解决方案 object[] GetAllPropVal<T>(T obj) { return typeof(T).GetProperties().Select(x => x.GetValue(obj, null)).ToArray(); } 解决方案二: PropertyInfo[] protys<T>(T t) { Type eleType = t.GetTyp

c3p0连接池中获取的Connection对象的close()方法是真的把连接给关闭了?

问题描述 c3p0连接池中获取的Connection对象的close()方法是真的把连接给关闭了? 自己做写了一个管理数据源的DBManager,构想中从数据源里面获取的Connection使用完之后执行close()方法,然后把Connection对象闲置回连接池中. 但是测试出来的结果好像每次执行close()之后connection就销毁了. 代码如下: DBManager.java package ben.DBUtils; import java.sql.Connection; impo

Python中的类与对象之描述符详解

 这篇文章主要介绍了Python中的描述符详解,属于Python学习过程中类与对象的基本知识,需要的朋友可以参考下     描述符(Descriptors)是Python语言中一个深奥但却重要的一部分.它们广泛应用于Python语言的内核,熟练掌握描述符将会为Python程序员的工具箱添加一个额外的技巧.为了给接下来对描述符的讨论做一些铺垫,我将描述一些程序员可能会在日常编程活动中遇到的场景,然后我将解释描述符是什么,以及它们如何为这些场景提供优雅的解决方案.在这篇总结中,我会使用新样式类来指代

Flash对象在(x)HTML中的格式和参数及安全性

这是份总结,有不恰达的地方欢迎一同讨论 联系方式 : 龙藏 longzang@taobao.com 点击这里全幅围观 或者点下面大图去 slideshare.net 站点围观: Flash对象在(X)Html中的格式和参数及安全性 PDF下载: Flash对象在(x)HTML中的格式和参数及安全性 Download "FlashObjectInHTML"

在ASP程序设计中在使用Response对象 2003

response|程序|对象|设计 Response对象在ASP程序设计中的主要功能是从浏览器端到服务器端传送数据到浏览器的客户端,我们知道ASP的脚本是在服务器端执行的,他并没有输出"值"的功能.要想拥有输出"值",就必须依靠Response对象. 在这里我们将关注其最常用的一些功能.也就是在程序设计中经常要用到的一些功能,具体如下: (1).response.write 发送信息到浏览器 (2). response.end 有效地中止代码 (3).respons

在ASP程序设计中在使用Response对象

   Response对象在ASP程序设计中的主要功能是从浏览器端到服务器端传送数据到浏览器的客户端,我们知道ASP的脚本是在服务器端执行的,他并没有输出"值"的功能.要想拥有输出"值",就必须依靠Response对象. 在这里我们将关注其最常用的一些功能.也就是在程序设计中经常要用到的一些功能,具体如下: (1).response.write 发送信息到浏览器 (2). response.end 有效地中止代码 (3).response.redirect 页面重定

事件对象在多线程编程中的应用

本课中我们将要学习事件对象以及如何在多线程编程中如何使用同步对象. 理论:上一课中我们演示了如何用WINDOWS消息在不同的线程之间进行通讯.另外的两种,即:使用全局变量和事件对象,将在本课中讲解. 事件对象就像一个开关:它只有两种状态---开和关.当一个事件处于"开"状态,我们称其为"有信号"否则称为"无信号".您可以在一个线程的执行函数中创建一个事件对象,然后观察它的状态,如果是"无信号"就让该线程睡眠,这样该线程占用的C