类成员和显式堆栈/堆分配

2023-12-21

假设我们有 4 个类,如下所示:

class A
{
    public:           
        A(void) : m_B()
        {
        }
    private:
        B m_B;
}

class B
{
    public:            
        B(void)
        {
           m_i = 1;
        }
    private:
        int m_i;
}

class C
{
    public:           
        C(void) 
        {
            m_D = new D();
        }
        ~C(void) 
        {
            delete m_D;
        }
    private:
        D *m_D;
}

class D
{
    public:           
        D(void)
        {
           m_i = 1;
        }
    private:
        int m_i;
}

假设有 4 种情况:

情况1:A在栈外部分配,B在栈内部分配

A myA1;

情况2:A外部分配在堆上,B内部分配在堆栈上

A *myA2 = new A();

情况3:C外部分配在栈上,D内部分配在堆上

C myC1;

情况4:C在堆外部分配,D在堆内部分配

C *myC2 = new C();

这些案例中发生了什么?例如,在情况2中,我理解指针myA2是在堆栈上分配的,A对象存在于堆中,但是m_B属性呢?我假设堆上也为其分配了空间,因为对象存在于堆空间中是没有意义的,然后它的属性就会超出范围。如果这是真的,那么这是否意味着外部堆分配会覆盖内部堆栈分配?

情况 3 怎么样,myC1 分配在堆栈上,而 m_D 分配在堆上。这里会发生什么?这两个部分是否跨内存分开?如果我从析构函数中删除“删除 m_D”并且 myC1 超出范围,那么在堆上为 m_D 分配的空间是否会出现内存泄漏?

如果有任何教程/文章详细介绍了这一点,我希望有一个链接。


我认为您混淆了“堆栈/堆分配”和“自动变量”。

自动变量当脱离上下文时会自动销毁。

堆栈分配事实是内存是在执行堆栈上分配的。分配在堆栈上的变量是自动变量。

Also, 成员是自动变量当其所有者被销毁时,其析构函数将被调用。对于指针,它们会被销毁,但底层对象不会被销毁,您必须显式调用delete。为了确保底层对象被销毁,您必须使用智能或唯一指针。

换句话说:您必须调用删除的变量/成员不是自动变量。

最后,类的成员被分配在其所有者的同一内存段上。

在你的代码中:

  • A.m_B是一个自动变量。如果A在栈上,则B也在栈上;如果A在堆上,则B也在栈上。
  • B.m_i和 D.m_i 是自动变量,将分配在其所有者的同一内存段上
  • The pointer C.m_D是一个自动变量,但D类型的指向对象不是,你必须在指针上显式调用delete来删除底层对象。因此,指针 C.m_D 分配在同一内存段上,而不是底层对象上。它显然是由 new 分配的,并且将位于堆上。

So:

  • Case 1:一切都在堆栈上并且是自动的(即:自动销毁)。
  • Case 2: myA2位于堆上并且不是自动的(您必须delete myA2)。其成员m_B2是一个自动变量,当myA2被摧毁了。也因为myA2位于堆上,m_B与类的任何成员一样,也位于堆的同一内存空间中。
  • Case 3: myC1位于堆栈上,是一个自动变量,指向的指针m_D也在堆栈上,但不是所指向的对象m_D它是由 new 在堆上分配的。
  • Case 4:与情况 3 相同,但是myC2位于堆上并且不是自动的。所以你必须删除myC2(这将删除m_D).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类成员和显式堆栈/堆分配 的相关文章

随机推荐

  • 如何处理 Hibernate-Search 索引恢复?

    当应用程序服务器意外退出时 Hibernate Search 无法正常关闭 Lucene 离开写锁每个索引目录后面的文件 这当然是很正常的事情 但是 重新启动应用程序后 锁定文件也会保留 这会导致某些时候出现锁超时异常 我的问题是是否有一种
  • 将递归二叉树遍历转换为迭代

    我被要求编写迭代版本 但我编写了递归版本 即 void inorderTraverse BinaryTree root if root NULL printf d root gt id else inorderTraverse root g
  • Flexbox - 元素位于顶部,另一个元素位于中心[重复]

    这个问题在这里已经有答案了 我怎样才能实现这样的目标 find必须垂直和水平居中 这是我的代码 main min height 50vh display flex justify content center menu padding 20
  • 避免 Dart 中类的继承

    Dart 有没有办法避免继承 我正在寻找类似的东西 final class MyJavaClass 不直接 不 您可以编写一个带有私有构造函数的类并通过静态方法访问它们 class MyFinalClass MyFinalClass cto
  • 攻击者能否破解 iOS 钥匙串和数据保护加密? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在开发一个 iOS 应用程序 它
  • Linux中进程的空闲时间

    我需要计算Linux中进程的CPU使用率 用户模式 系统模式 空闲时间 我可以使用以下方法计算用户和系统模式下的使用情况utime and stime值来自 proc PID stat 但我没有发现任何与空闲时间相关的内容 我知道我可以从中
  • .Net 5 后台服务的 MSI 安装程序

    我有一个 Net 5 控制台应用程序 我试图将其作为 Windows 服务运行 我已阅读有关如何执行此操作的所有在线文章并成功完成 即 使用BackgroundService 问题是 我想要一个 MSI 安装程序来部署它 并且我读过的有关在
  • 在 Visual Basic 中打印(多)维数组

    有没有一种简单的方法可以将可能是多维的数组打印到 VB NET 中的控制台以进行调试 即仅检查数组的内容是否正确 来自 Objective C 背景NSLog函数打印格式相当良好的输出 例如一维数组的以下内容 myArray 0 gt He
  • 了解 applicationSignificantTimeChange:

    我发现有时我的应用程序 Cocos2d 游戏 在显着的时间变化后会出现 错误 例如 case 1 当应用程序进入后台并在几分钟后重新启动它时 我可以看到加载图像然后应用程序 游戏恢复 case 2 当应用程序进入后台并在很长一段时间后更改应
  • __NSAutoreleaseNoPool():类 General 自动释放的对象 0x753c2f0,没有适当的池 - 只是泄漏

    我已经有一段时间没有注意到我的控制台输出了 我突然注意到很多奇怪的错误 NSAutoreleaseNoPool Object 0x753c2f0 of class General autoreleased with no pool in p
  • 向行值添加尾随零以确保有 10 位数字

    如果我有一个数据帧 其中每行中的最大数字为 10 但由于尾随零已被截断 某些 ID 小于 10 那么如何在 python 中添加尾随零以确保每行中有 10 位数字 ID 1234567689 123456768 12345676 ID 12
  • Magento:使用分组子句过滤集合

    我想用分组子句过滤集合 在 SQL 中 这看起来像 SELECT FROM my table WHERE col1 x AND col2 y OR col3 z 我如何将其 翻译 为过滤集合 gt addFieldToFilter Than
  • Jenkins 无法使用 SVN 凭据或下载新插件/新版本

    谁能建议如何解决这两个问题 无法升级Jenkins和SVN插件 无法连接到svn 我正在 Windows 64 位机器上设置 Jenkins 它被配置为作为 Windows 服务运行 我们在 Windows 7 64 位操作系统上运行它 詹
  • 如何在Springboot Restcontroller中使用PUT方法?

    正在使用 Spring boot 开发一个应用程序 我尝试了所有表示动词 如 GET POST DELETE 它们也都工作正常 使用 PUT 方法 Spring Boot 不支持 我是否需要添加任何新配置 Put方法仅适用于没有任何参数的请
  • 模型中包含的辅助方法会产生“未定义的局部变量或方法‘config’”错误

    我有一个非常复杂的辅助方法 也需要在模型中 我已经通过在模型中包含一些助手来完成此操作 但相同的方法不适用于 Rails 3 0 7 module ContentsHelper def content teaser record it us
  • 为什么转换为单击一次应用程序或exe后不进行日志记录?

    我创建了一个控制台应用程序 其中使用 log4net 正确完成日志记录 但是在发布我的应用程序 单击一次应用程序或 exe 后 即使我的应用程序工作正常 日志记录也无法正常工作 有什么方法可以让 log4net 在我的最终点击应用程序中工作
  • Linux邮件添加内容类型标头不起作用

    我在用mail从我的 Linux 系统发送邮件的命令 我遇到的问题是邮件的内容类型始终为Content Type text plain charset us ascii 我正在发送 html 内容 它显示为纯文本 这就是我尝试过的 1 bo
  • 纯文本文档的字符编码未声明 - mootool 脚本

    我刚刚注意到有一个warning当我在 FireFox 浏览器上查看 mootool js 脚本时 会弹出消息 警告消息是 纯文本文档的字符编码未声明 文档在某些浏览器中会呈现乱码 如果文档包含来自外部的字符 则配置 US ASCII 范围
  • 在 Sonata 管理列表中使用自定义列

    我使用 Symfony 4 1 创建了一个项目 并安装了 Sonata Admin Bundle 在我的类别列表中 我尝试添加与类别字段不相关的列 所以我做了 Admin CategoryAdmin php protected functi
  • 类成员和显式堆栈/堆分配

    假设我们有 4 个类 如下所示 class A public A void m B private B m B class B public B void m i 1 private int m i class C public C voi