只允许对象生成于堆内

只允许对象生成于堆内?怎么理解?肿么办?

假如,手头上有一个类Person,当你在程序中写下Person rn时,

编译器悄悄地做了两件事:调用constructor构造对象rn,而在弹栈时,调用destructor析构对象rn。

对象rn的构造和析构全部由编译器负责,这是栈的特性!

诸所周知,对象rn生成于栈内。

而我们现在的要求是什么?“只允许对象生成于堆内。”rn明显违背了我们的要求,也就意味着它应该被禁止。

那这种 “坑爹型”的事情肿么办呢?有人想说,只要让Person的构造函数或者析构函数成为private就OK了。

也许许多人真会有这样的第一想法,假使那样,咱再往下进一步思考。

如果那样的话,这个类可以实现继承吗?No,即就是禁止继承。

另外,这个类允许其他类拥有它的对象吗?No,即就是禁止包含。

那怎么办呢? 解决的方法也很简单,解除继承的副作用只需让Person的析构函数成为protected就可以了;

解决内含的副作用只需让Test中的成员变量ps成为Person*类型并在Test的构造/析构函数中对成员变量做初始化和释放操作就可以了。

本例完整的代码如下所示。
#include<iostream>
using  namespace std;

class Person
{
public:
    Person()
    {
        cout<<"Con()"<<endl;
    }
    Person(int x)
    {
        a = x;
        cout<<"Con(x)"<<endl;
    }
    void  Destroy()
    {
        delete this;
    }

protected:
    ~Person()
    {
        cout<<"Des"<<endl;
    }
private:
    int a;
};

class  Student:public Person
{

};

class Test
{
public:
    Test()
    {
        ps = new  Person();    //堆上对象
    }
    ~Test()
    {
        ps->Destroy();
    }
private:
    Person *ps;
};

void main()
{
    Test t1;
}转载自:http://www.cnblogs.com/Braveliu/archive/2013/01/06/2847475.html
时间: 2024-10-05 05:19:44

只允许对象生成于堆内的相关文章

C# CLR via 对象内存中堆的存储【类型对象指针、同步块索引】

最近在看书,看到了对象在内存中的存储方式. 讲到了对象存储在内存堆中,分配的空间除了类型对象的成员所需的内存量,还有额外的成员(类型对象指针. 同步块索引 ),看到这个我就有点不懂了,不知道类型对象指针是什么,指向的什么? 从网上找也没有找到,最后往下看,书中有些描述.说下我的理解: 类型对象指针:指向类型对象存储的地址,假如有一个类型Person,它在堆中有一块区域存储它内部的字段和成员以及两个额外成员(类型对象指针. 同步块索引 ),类型对象的类型对象指针指向的是System.Type的地址

如何判断一个C++对象是否在堆上(通过GetProcessHeaps取得所有堆,然后与对象地址比较即可),附许多精彩评论

在帖子如何判断一个C++对象是否在堆栈上 中, 又有人提出如何判断一个C++对象是否在堆上. 其实我们可以参照那个帖子的方法类似实现,我们知道堆就是Heap,在windows上我们可以通过GetProcessHeaps来得到所有的堆句柄,而我们这里只要知道Windows上的Heap Handle,其实就是堆的起始地址,就可以写如下代码了. #include <iostream>#include <windows.h> using namespace std; BOOL IsObje

C++——内存对象 禁止产生堆对象 禁止产生栈对象

用C或C++写程序,需要更多地关注内存,这不仅仅是因为内存的分配是否合理直接影响着程序的效率和性能,更为主要的是,当我们操作内存的时候一不小心就会出现问题,而且很多时候,这些问题都是不易发觉的,比如内存泄漏,比如悬挂指针. 我们知道,C++将内存划分为三个逻辑区域:堆.栈和静态存储区.既然如此,我称位于它们之中的对象分别为堆对象,栈对象以及静态对象.那么这些不同的内存对象有什么区别了?堆对象和栈对象各有什么优劣了?如何禁止创建堆对象或栈对象了? 一.基本概念 先来看看栈. 栈,一般用于存放局部变

Javascript 面向对象一:封装数据个方法,从原型对象生成实例

一. 生成对象的原始模式 假定我们把猫看成一个对象,它有"名字"和"颜色"两个属性. var Cat = { name : '', color : '' } 现在,我们需要根据这个原型对象的规格(schema),生成两个实例对象. var cat1 = {}; // 创建一个空对象 cat1.name = "大毛"; // 按照原型对象的属性赋值 cat1.color = "黄色"; var cat2 = {}; cat2.n

咸蛋系列一●《模板模式构建随机对象生成》2 构思

随机对象生成可以说是随机数生成的一个延伸,在实际使用中,我们可能要生成的不是一个简简单单的数字,而是像数字.大小写字符.中文汉字.算数表达式等. 由于其实现相对简单,取各种随机对象的源码网上也比比皆是,因而貌似也没人做一个通用的.可扩展的随机对象生成. 博主要不是因为闲得蛋疼也是不会想到做这个东西的,好了,言归正传.分析随机对象生成,其要点无外乎三点: 1. 设置随机对象集: 2. 获取一个或多个随机对象: 3. 获取一个或多个不重复随机对象: 在这三点中,后两者算法皆固定,仅设置对象集不同,故

js生成某个范围内的随机数

根据random方法,Math.random()方法返回的是0到1的随机数(不包含0和1): ? 1 2 3 4 5 6 7 8 //生成k个m到n的随机数,返回数组     function Temp(m,n,k) {         var all = new Array();         for (var i = 0; i < k; i++) {             all[i] = Math.floor(Math.random()*(n-m) + m); //Math.floor

深入理解Spring AOP之二代理对象生成

深入理解Spring AOP之二代理对象生成 spring代理对象 上一篇博客中讲到了Spring的一些基本概念和初步讲了实现方法,当中提到了动态代理技术,包含JDK动态代理技术和Cglib动态代理 动态代理这部分我有过一篇博客介绍:动态代理,想深入了解的朋友能够看一看,再回想一下,Spring中怎样区分採用JDK动态代理和CGlib动态代理: 假设目标对象的实现类实现了接口.Spring AOP 将会採用 JDK 动态代理来生成 AOP 代理类: 假设目标对象的实现类没有实现接口,Spring

const对象仅在文件内有效-谈extern/作用域

<C++ Primer>中指出,const对象仅在文件内有效(2.4章 page54). WHAT? const对象 :分两步 - 1,找到对象 2,加const (注意陷阱) 文件内 :指的是在一个项目中,相互独立的文件.即没有#include! 1 const int i = 10; // ok 2 const char* s1 = "Do not use include"; // error! is not const-object 3 char* const s2

PHP“Cannot use object of type stdClass as array” (php在调用json_decode从字符串对象生成json对象时的报错)

php再调用json_decode从字符串对象生成json对象时,如果使用[]操作符取数据,会得到下面的错误 错误:Cannot use object of type stdClass as array 产生原因: +展开 -PHP $res = json_decode($res); $res['key']; //把 json_decode() 后的对象当作数组使用. 解决方法(2种):1.使用 json_decode($d, true).就是使json_decode 的第二个变量设置为 tru