构造函数与析构函数的保护权限

2023-11-07

    通常我们如果希望对象只在堆上创建,我们会将析构函数定义为protect或private类型,这种情况下我们还要添加一个函数来析构对象,因为此时在类外部无法使用delete释放对象,因为析构函数被保护,那么究竟为什么限制析构函数的访问权限可以避免栈对象被创建呢,详细原因如下:

    我们来分析类对象的内存分配与释放问题:栈对象和堆对象。

    1、栈空间的对象是编译器自动完成初始化与释放的,它的原理是在编译阶段编译器就会为一个栈对象分配空间(这里分配空间指的是按一定规则分配地址,并不是真正的分配内存空间,那什么时候分配内存呢,在程序装载是会对编译器已分配的地址进行重定向,重定向的概念还记得吧,重定向之后这些地址便有了真正的内存与之对应了),并自动调用构造函数和析构函数(作用域结束的地方),这样一来就必须知道构造函数与析构函数的定义。堆空间大小有限,过多的栈对象会导致栈溢出,由于栈对象是在编译阶段分配地址的,如果地址不够用编译阶段会报错。

   2、堆空间的对象是在运行时期动态创建与释放的,这个工作有程序员自己完成,因此,编译器在遇到创建堆对象代码时,会自动调用operator new()函数来分配内存,之后会调用该对象的构造函数来完成初始化,但并不自动调用析构函数。

    经过分析我们可以知道栈对象会调用构造函数和析构函数,堆对象会调用operator new和构造函数,很明显限制析构函数的访问权限会导致栈对象不能使用而堆对象不受影响。

    这里延伸记录一下关于程序内存问题,编译器会在编译阶段为类、函数、静态和全局变量等规划地址,这些地址一般划分区域为:数据区、代码区、栈区和堆区,因此不是自己以前想象的大部分地址都是运行时才确定,比如类的成员函数,所有对象的成员函数地址是相通的,在编译阶段已经确定的(一般在代码区),而对象一般仅包含成员变量(数据区、栈区或堆区),两者在地址并不相关,不要企图用对象地址来获取函数地址。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构造函数与析构函数的保护权限 的相关文章

  • 仅使用扩展方法在 Linq 中进行漂亮、干净的交叉连接 [重复]

    这个问题在这里已经有答案了 可能的重复 使用扩展方法表示的嵌套 from LINQ 查询 https stackoverflow com questions 9115675 nested from linq query expressed
  • 使用 C++ 拆分“[常规设置]”格式的节字符串

    我是 C 新手 我想读取包含部分和键值对的 ini 文件 根据部分 我想读取相应键的值 首先 我想阅读方括号内的部分 请帮忙 谢谢 对于真正的 INI 文件解析 我强烈建议iniparser库 http ndevilla free fr i
  • MySql 最后插入 ID,连接器 .net

    我正在使用 MySql Connector net 我需要获取最后一个查询生成的插入 id 现在 我假设返回值是MySqlHelper ExecuteNonQuery应该是最后一个插入id 但它只返回1 我正在使用的代码是 int inse
  • 在调用堆栈中看到大量 clr!CLR Semaphore::Wait

    我们看到很多像下面这样的调用堆栈 我可以知道什么条件 情况会发生这种情况吗 OS Thread Id 0x48654 559 Current frame ntdll NtWaitForSingleObject 0xa Child SP Re
  • 操作/Lambda 表达式内存管理问题

    我将一个操作存储在局部变量中 然后在该局部变量超出范围后使用 使用前是否有被清理的危险 这是一个例子 public List GetMaps Action
  • Confuser .NET 混淆器。安全吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我目前正在开发一个应用程序 其中阻止用户反编译代码非常重要 现在 我意识到 如果由经验丰富的程序员执行 大多数 exe 都是可反编译的
  • 在 C# 中调用事件处理程序

    我一直在尝试学习如何在 C 中使用事件处理程序 但我无法弄清楚 handler this e 在以下代码中的作用 public event EventHandler ThresholdReached protected virtual vo
  • C++:将模板参数的模板类型成员添加为好友的正确语法?

    我有一个带有模板类型参数 tTRAIT 的类 我想加一个模板为好友type member aliastTRAIT 但我无法弄清楚语法 这可能吗 template
  • 使用 size_t 值反向遍历向量

    我想以相反的方向遍历向量的值 如您所知 向量的大小为 size t 当我使用以下代码时 for size t r m size 1 r gt 0 r x r f r for size t c r 1 c lt m size c x r m
  • C++:初始化静态字符串成员

    我在 C 中初始化静态字符串成员时遇到一些问题 我有几个类 每个类都包含几个表示 id 的静态字符串成员 当我通过调用静态函数初始化变量时 一切都很好 但是 当我想为一个变量分配另一个变量的值时 它仍然保留空字符串 这段代码有什么问题 st
  • 捕获另一个进程未处理的异常

    我想知道我是否可以捕获我开始使用 Process Start 的另一个进程抛出的未处理的异常 我知道我可以用这个捕获标准错误link http social msdn microsoft com Forums en US csharpgen
  • ASP.NET MVC 路由 - 向路由添加 .html 扩展名

    我对 MVC 和路由非常陌生 我被要求修改一个应用程序以使用不同的 url 由于我没有经验 这项任务对我来说有点困难 好吧 让我们谈谈一些代码 routes MapRoute CategoryBySeName Route name prod
  • 使用 INotifyPropertyChanged

    有人可以解释一下为什么在 wpf 中使用绑定时需要使用 INotifyPropertyChanged 的 实现吗 我可以在不实现此接口的情况下绑定属性吗 例如我有代码 public class StudentData INotifyProp
  • 如何解决内存碎片

    我们偶尔会遇到这样的问题 长时间运行的服务器进程 在 Windows Server 2003 上运行 由于内存分配失败而引发异常 我们怀疑这些分配由于内存碎片而失败 因此 我们一直在寻找一些可能对我们有帮助的替代内存分配机制 我希望有人能告
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat
  • 参数数量在编译时确定的 Lambda 函数

    我想声明一个带有 N 个参数的 lambda 函数 其中 N 是模板参数 就像是 template
  • 未找到 _sqlite3_open 等符号错误

    您好 我收到此错误 Undefined symbols sqlite3 open referenced from main in ccRlWVer o sqliite3 close referenced from main in ccRlW
  • 如何在 Winform DataGridView 中创建不同的单元格格式

    我有一个 DataGridView 我将其绑定到 DataTable DataTable 是一个全数字值 要求 DataGridView 中的每 n 行都包含文本 而不是数值 以便在视觉上为用户分隔部分 我很高兴在绑定后将此文本数据放入 D
  • 获取会议组织者邮件地址 EWS API

    我想使用 EWS API 获取会议组织者的邮件地址 目前 我刚刚获得约会项目的一些属性 我听说你可以设置你想要获取哪些属性 我的代码看起来像这样 CalendarView cview new CalendarView start end c
  • 清理堆分配对象的良好实践或约定?

    我正在学习C 我有 C C ObjC 背景 相当高级的语言 在 C 或 ObjC 上 作为函数或方法的结果返回堆分配的对象是很简单的 因为对象的清理是受管理的 按照惯例 会在适当的时候销毁 但我不知道在 C 中应该如何处理这个问题 例如 s

随机推荐

  • 一张表格分成两页打印_word一页内容怎么分成两页打印

    word一页内容怎么分成两页打印 我们经常在打印时会选择把两页A4打在一张A3上 但有的时候也会需要把一张A3的内容分成两页A4来打印 那么 如何进行操作呢 下面就来看看小编的做法吧 调整页面布局 页面设置 纸张 将纸张大小有A3修改为A4
  • 如何用python画雪人_小雪人图案

    效果图如下 代码如下 import turtle t turtle Turtle t speed 0 右眼睛 t up t goto 80 80 t down t begin fill t circle 20 t end fill 右眉毛
  • blender bpy入门笔记

    目录 bpycv 加载 渲染demo 可以导出图片 但是图片为空 导出obj模型 随机旋转 录制常见脚本 渲染属性 胶片 gt 透明 其他命令 bpycv https github com DIYer22 bpycv 加载 渲染demo i
  • MMSegmentation训练自己的分割数据集

    首先确保在服务器上正常安装了MMSeg 注意安装完还需建立与自己的数据集之间的软连接 官方安装教程如下 https github com open mmlab mmsegmentation blob master docs get star
  • Python flask-restful 框架讲解

    1 简介 Django 和 Flask 一直都是 Python 开发 Web 的首选 而 Flask 的微内核更适用于现在的云原生微服务框架 但是 Flask 只是一个微型的 Web 引擎 所以我们需要扩展 Flask 使其发挥出更强悍的功
  • RedisTemplate和StringRedisTemplate的区别

    RedisTemplate和StringRedisTemplate的区别 1 两者的关系是StringRedisTemplate继承RedisTemplate 2 两者的数据是不共通的 也就是说StringRedisTemplate只能管理
  • 索引构造与信息检索:让 ChatGPT 成为 Selenium 问答助手

    这是chatgpt为我生成的3个标题 我选了第3个 利用 Langchain 和 GPT 实现 Selenium 机器人自动问答 向量化存储和检索 如何用相似度搜索匹配 Selenium 知识 索引构造与信息检索 让 ChatGPT 成为
  • open3d python版本安装及安装过程中遇到的问题

    本文介绍一下我在安装open3d包过程中遇到的问题 pip安装 pip install open3d pip install open3d i https pypi tuna tsinghua edu cn simple or pip in
  • npm镜像设置

    查看镜像列表 npm isntall g nrm nrm ls 根据镜像列表地址来设置镜像 例如 npm config set registry https registry npmjs org 查看镜像 npm config get re
  • 高通QCM6125的LK部分(uefi/xbl)编译

    高通在QCM6125安卓10 0加入了UEFI 以前的lk相关代码移到了boot images QcomPkg路径下 编译方式和之前也不同了 编译环境 编译时错误提示 需要工具在这个路径 pkg qct software llvm rele
  • KNX协议入门

    KNX协议入门 转自 https wenku baidu com view 65b0a25a55270722182ef706 html 如有侵权 请联系qq 2453419889 我将立即删除 一 KNX技术简介 KNX通过一条总线将各个分
  • Dapper功能讲解

    简述 适用特性 使用Dapper流程 代码示例 简述 Dapper是一个轻量级的ORM工具 ORM框架的核心思想是对象关系映射 ORM是将表与表之间的操作 映射成对象和对象之间的操作 就是通过操作实体类来达到操作表的目的 从数据库提取的数据
  • [637]文件或目录损坏且无法读取CHKDSK修复方法

    文件或目录损坏且无法读取 不要太担心是出现了磁盘坏道 也许只是小小的存储问题 解决方法很简单 用chsdsk命令即可 方法如下 开始 运行 输入cmd 输入chkdsk 盘符 f 例如 chkdsk c f 等命令运行完即可 注意 冒号后面
  • matlab中size()的用法

    size A 设有一矩阵为A 则size A 返回的是一行向量 该行向量的第一个元素时矩阵的行数 第二个元素是矩阵的列数 size A 1 获取矩阵A的行数 size A 2 获取矩阵A的列数
  • 数学的1000+篇文章总结

    数学的1000 篇文章总结 本文收集和总结了有关数学的1000 篇文章 由于篇幅有限只能总结近期的内容 想了解更多内容可以访问 http www ai2news com 其分享了有关AI的论文 文章 图书 query 第13章 爱因斯坦 量
  • C#实现程序的版本升级更新

    我们做了程序 不免会有版本升级 这就需要程序有自动版本升级的功能 那么看看我是如何实现程序自动更新的 直接上代码 using System using System Collections Generic using System Text
  • 数学建模学习2论文排版

    如何写论文 一 四点注意事项 一 标题与正文层次分明 二 正文排版紧凑 三 表格与图片格式 四 公式编辑 二 如何写标题 一 要求 二 格式及示例 三 如何写摘要 一 要求 二 格式及示例 1 总体格式图 2 开头段模板 3 中间段模板 4
  • 机器学习笔记-感知机对偶形式

    文章目录 前言 一 感知机对偶形式 二 感知机对偶形式的实现 总结 前言 感知机模型是有两种形式的 上一篇文章中详细学习了感知机的原始形式数学模型 我们知道 感知机应该还有对偶形式 这篇文章就来记录一下感知机对偶形式的的数学模型 一 感知机
  • Object.entries()

    Object entries 方法返回一个给定对象自身可枚举属性的键值对数组 其排列与使用 for in 循环遍历该对象时返回的顺序一致 区别在于 for in 循环还会枚举原型链中的属性 语法 Object entries obj 参数
  • 构造函数与析构函数的保护权限

    通常我们如果希望对象只在堆上创建 我们会将析构函数定义为protect或private类型 这种情况下我们还要添加一个函数来析构对象 因为此时在类外部无法使用delete释放对象 因为析构函数被保护 那么究竟为什么限制析构函数的访问权限可以