只允许对象生成于堆内
只允许对象生成于堆内?怎么理解?肿么办?
我们已经知道,假如手头上有一个类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
只允许对象生成于堆内相关推荐
- Spark 内存管理堆内和堆外内存规划_大数据培训
堆内和堆外内存规划 作为一个 JVM 进程,Executor 的内存管理建立在 JVM 的内存管理之上,Spark 对 JVM 的堆内(On-heap)空间进行了更为详细的分配,以充分利用内存.同时, ...
- 一文深入了解史上最强的Java堆内缓存框架Caffeine
它提供了一个近乎最佳的命中率.从性能上秒杀其他一堆进程内缓存框架,Spring5更是为了它放弃了使用多年的GuavaCache 缓存,在我们的日常开发中用的非常多,是我们应对各种性能问题支持高并发的一 ...
- python内置对象的实现_Python 内置对象的实现
准备回顾一下python源代码,不过不准备说的太细,尽量勾勒框架,不引用代码. python中所有东西都是对象,进一步地,这些对象可以分为类型对象(type)or实例对象,有时一个对象即可以是类型,也 ...
- java堆内与堆外数据交互_Java:汇总堆外数据
java堆内与堆外数据交互 探索如何以最小的垃圾回收影响和最大的内存利用率创建堆外聚合. 使用Java Map,List和Object创建大型聚合通常会产生大量堆内存开销. 这也意味着,一旦聚合超 ...
- java 查看堆外内存占用_如何监控和诊断JVM堆内和堆外内存使用?
上一讲我介绍了 JVM 内存区域的划分,总结了相关的一些概念,今天我将结合 JVM 参数.工具等方面,进一步分析 JVM 内存结构,包括外部资料相对较少的堆外部分. 今天我要问你的问题是,如何监控和诊 ...
- 在JavaScript中生成特定范围内的随机整数?
如何可以生成两个指定的变量之间的随机整数在JavaScript中,例如x = 4和y = 8将输出任何的4, 5, 6, 7, 8 ? #1楼 对于具有范围的随机整数,请尝试: function ra ...
- 用引导对象生成图像描述(Intention Oriented Image Captions with Guiding Objects 翻译)
论文来自CVPR2019 论文地址: https://ieeexplore.ieee.org/document/8954294/ 用引导对象生成图像描述 概要 虽然现有的图像描述模型可以使用递归神经网 ...
- 如何理解成员变量在堆内,局部变量在栈内?
成员变量在堆内存里,局部变量在栈内存里.(基础类型) 我有疑惑: 既然成员变量存在于对象中,对象存在于堆中,所以成员变量存在于堆中.那么按照这样的推理,局部变量存在于方法中,而方法存在于对象中,对象存 ...
- Java堆内内存和堆外内存
1.堆内内存概念 堆内一般指堆内内存,英文全称:on-heap memory (heap:堆,java的内存区) java虚拟机分配非空对象一般就放到堆内内存,并且虚拟机会定期会进行垃圾回收在某些特定 ...
最新文章
- 拯救尴尬:鉴黄神器NSFW JS开源了!
- 微软招聘研究实习生,base美国or加拿大
- 五、cookie和web缓存
- 【Linux】Centos7 解压zip文件
- 允许使用抽象类类型 isearchboxinfo 的对象_Java面向对象编程三大特征 - 多态
- Python中List的复制(直接复制、浅拷贝、深拷贝)
- 面试必备之为什么重写equals必须重写hashcode
- Android之控件与布局,结构知识点,基础完结
- PMP考试中关于应急准备金和管理应急准备金的总结
- 深度 | Android 整体设计及背后意义
- matlab噪声 方差_产生多种分布的热噪声信号
- 【综述】跨语言自然语言处理笔记
- 【POJ2752】Seek the Name, Seek the Fame(hash)
- 操作系统实验报告一 进程调度
- html网页中图片展示为碎片,基于HTML代码实现图片碎片化加载功能
- 2021-10-11日python笔记(VM虚拟机安装Linux)
- 软考 案例分析__预测
- Interledger协议(ILP)
- 安卓productFlavors多渠道打包简单使用
- (听说标题越短事越大)
热门文章
- 对‘pthread_create’未定义的引用_【学习贴士】引用文献不积极,APA Guideline 帮助你...
- linux mysql详解,Linux 下mysql安装使用详解
- 计算机一级必考知识点,计算机一级word操作知识点
- stm32单片机屏幕一直闪_stm32实现LED灯的闪烁
- 理解LSTM/RNN中的Attention机制
- 通过实例学习如何使用telerik:RadListView控件
- 电子商务企业借力呼叫中心提高效率
- Java实现 简单聊天软件
- 【转载】Java JVM 运行机制及基本原理
- cordova编译报错:Execution failed for task ':processDebugResources'