【问题标题】:Freeing abstract class pointers释放抽象类指针
【发布时间】:2011-09-25 14:05:59
【问题描述】:

在 C++ 中,我有一个 class A,它有一个抽象类指针以允许包含在 class B 中的多态性,我还有另一个指向抽象 class C 的指针,它分配了 @987654324 子类的具体实例@ 进入该内存,我需要从class C 调用清理(见下面的问题)函数来释放我从堆分配的class B 的子类占用的内存,问题是我不能保证我可以访问清理功能,因为我只有一个指向 class C 的指针,我不能只是复制它,因为当我调用需要销毁包含的 class A 时,它可能已经消失了。

为了解决无法访问清理功能的问题,我是否可以在 class A 指针上调用 delete,即使我指向子类? C++ new 是否也像 malloc 一样存储堆块大小,以便您可以删除指向这样的抽象类的指针所引用的内存? 如果不是,是否有另一种方法来组织允许我处理的程序情况?

【问题讨论】:

  • 实际代码会有点复杂,正如您可能从它的摘要中看出的那样,如果有人否定地回答主要问题并且我需要重组我的所有课程,我可以发布代码,也许再澄清一下情况。
  • 不幸的是,摘要比实际代码更难理解。不过,不要发布您的真实代码,而是制作一个最小、完整的示例来展示您的问题。通常这样的代码会以class Foo {开头。

标签: c++ virtual new-operator abstract delete-operator


【解决方案1】:

标准状态(§5.3.5 ¶3):

在第一种选择(delete object)中,如果操作数的静态类型与其动态类型不同,则静态类型应为操作数的动态类型和静态类型的基类应该有一个虚拟析构函数或行为未定义。

如果我理解正确的话,你有一个派生类型的对象,并且你持有一个指向它的指针,它的静态类型是它的基类之一;所以,你没问题,只要你有 virtual 析构函数。


编辑好吧,我太慢了:P

【讨论】:

    【解决方案2】:

    我正在使用我的水晶球,因为你的问题很难理解,但你可能需要虚拟析构函数。

    【讨论】:

    • 真的看粗体部分,背景有点乱。我的主要问题是关于删除虚拟类指针引用的内存,假设我的析构函数是虚拟的,这样做是否安全?
    • 水晶球技巧不错!现在告诉我为什么我的 3D 立体图 DirectX 网络应用没有获得足够的 FPS...
    • 射手座:火星和木星的星座以及强烈的疯狂活动会影响你的黄道带。现在不是开发 DirectX 应用的好时机。
    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    相关资源
    最近更新 更多