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

我们已经知道,假如手头上有一个类Person,当你在程序中写下Person objTemp;时,

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

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

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

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

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

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

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

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

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

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

本例完整的代码如下所示。

 1 #include<iostream>
 2 using  namespace std;
 3
 4 class Person
 5 {
 6 public:
 7     Person()
 8     {
 9         cout<<"Con()"<<endl;
10     }
11     Person(int x)
12     {
13         a = x;
14         cout<<"Con(x)"<<endl;
15     }
16     void  Destroy()
17     {
18         delete this;
19     }
20
21 protected:
22     ~Person()
23     {
24         cout<<"Des"<<endl;
25     }
26 private:
27     int a;
28 };
29
30 class  Student:public Person
31 {
32
33 };
34
35 class Test
36 {
37 public:
38     Test()
39     {
40         ps = new  Person();    //堆上对象
41     }
42     ~Test()
43     {
44         ps->Destroy();
45     }
46 private:
47     Person *ps;
48 };
49
50 void main()
51 {
52     Test t1;
53 }

Good Good Study, Day Day Up.

顺序  选择  循环  坚持

转载于:https://www.cnblogs.com/Braveliu/archive/2013/01/06/2847475.html

只允许对象生成于堆内相关推荐

  1. Spark 内存管理堆内和堆外内存规划_大数据培训

    堆内和堆外内存规划 作为一个 JVM 进程,Executor 的内存管理建立在 JVM 的内存管理之上,Spark 对 JVM 的堆内(On-heap)空间进行了更为详细的分配,以充分利用内存.同时, ...

  2. 一文深入了解史上最强的Java堆内缓存框架Caffeine

    它提供了一个近乎最佳的命中率.从性能上秒杀其他一堆进程内缓存框架,Spring5更是为了它放弃了使用多年的GuavaCache 缓存,在我们的日常开发中用的非常多,是我们应对各种性能问题支持高并发的一 ...

  3. python内置对象的实现_Python 内置对象的实现

    准备回顾一下python源代码,不过不准备说的太细,尽量勾勒框架,不引用代码. python中所有东西都是对象,进一步地,这些对象可以分为类型对象(type)or实例对象,有时一个对象即可以是类型,也 ...

  4. java堆内与堆外数据交互_Java:汇总堆外数据

    java堆内与堆外数据交互 探索如何以最小的垃圾回收影响和最大的内存利用率创建堆​​外聚合. 使用Java Map,List和Object创建大型聚合通常会产生大量堆内存开销. 这也意味着,一旦聚合超 ...

  5. java 查看堆外内存占用_如何监控和诊断JVM堆内和堆外内存使用?

    上一讲我介绍了 JVM 内存区域的划分,总结了相关的一些概念,今天我将结合 JVM 参数.工具等方面,进一步分析 JVM 内存结构,包括外部资料相对较少的堆外部分. 今天我要问你的问题是,如何监控和诊 ...

  6. 在JavaScript中生成特定范围内的随机整数?

    如何可以生成两个指定的变量之间的随机整数在JavaScript中,例如x = 4和y = 8将输出任何的4, 5, 6, 7, 8 ? #1楼 对于具有范围的随机整数,请尝试: function ra ...

  7. 用引导对象生成图像描述(Intention Oriented Image Captions with Guiding Objects 翻译)

    论文来自CVPR2019 论文地址: https://ieeexplore.ieee.org/document/8954294/ 用引导对象生成图像描述 概要 虽然现有的图像描述模型可以使用递归神经网 ...

  8. 如何理解成员变量在堆内,局部变量在栈内?

    成员变量在堆内存里,局部变量在栈内存里.(基础类型) 我有疑惑: 既然成员变量存在于对象中,对象存在于堆中,所以成员变量存在于堆中.那么按照这样的推理,局部变量存在于方法中,而方法存在于对象中,对象存 ...

  9. Java堆内内存和堆外内存

    1.堆内内存概念 堆内一般指堆内内存,英文全称:on-heap memory (heap:堆,java的内存区) java虚拟机分配非空对象一般就放到堆内内存,并且虚拟机会定期会进行垃圾回收在某些特定 ...

最新文章

  1. 拯救尴尬:鉴黄神器NSFW JS开源了!
  2. 微软招聘研究实习生,base美国or加拿大
  3. 五、cookie和web缓存
  4. 【Linux】Centos7 解压zip文件
  5. 允许使用抽象类类型 isearchboxinfo 的对象_Java面向对象编程三大特征 - 多态
  6. Python中List的复制(直接复制、浅拷贝、深拷贝)
  7. 面试必备之为什么重写equals必须重写hashcode
  8. Android之控件与布局,结构知识点,基础完结
  9. PMP考试中关于应急准备金和管理应急准备金的总结
  10. 深度 | Android 整体设计及背后意义
  11. matlab噪声 方差_产生多种分布的热噪声信号
  12. 【综述】跨语言自然语言处理笔记
  13. 【POJ2752】Seek the Name, Seek the Fame(hash)
  14. 操作系统实验报告一 进程调度
  15. html网页中图片展示为碎片,基于HTML代码实现图片碎片化加载功能
  16. 2021-10-11日python笔记(VM虚拟机安装Linux)
  17. 软考 案例分析__预测
  18. Interledger协议(ILP)
  19. 安卓productFlavors多渠道打包简单使用
  20. (听说标题越短事越大)

热门文章

  1. 对‘pthread_create’未定义的引用_【学习贴士】引用文献不积极,APA Guideline 帮助你...
  2. linux mysql详解,Linux 下mysql安装使用详解
  3. 计算机一级必考知识点,计算机一级word操作知识点
  4. stm32单片机屏幕一直闪_stm32实现LED灯的闪烁
  5. 理解LSTM/RNN中的Attention机制
  6. 通过实例学习如何使用telerik:RadListView控件
  7. 电子商务企业借力呼叫中心提高效率
  8. Java实现 简单聊天软件
  9. 【转载】Java JVM 运行机制及基本原理
  10. cordova编译报错:Execution failed for task ':processDebugResources'