【问题标题】:C++ Ref Count Changes While Destructing Object破坏对象时 C++ 引用计数更改
【发布时间】:2011-06-22 01:27:46
【问题描述】:

我在 SharedObject 类中有一个私有引用计数。 SharedObject 是其他类的基类,例如 Window。 Window是Editor的基类。

当 ref 计数达到 0 时,由于调用 SharedObject::Release(),SharedObject 会自行删除。首先我们到Editor的析构函数,这表明this指针包含m_refs == 0,但是当我们到达Window析构函数时它突然变为1,当我们到达SharedObject析构函数时,它仍然是1。

我在 SharedObject::IncRef() 方法上设置了一个断点,但发生这种情况时它从未被调用过。

什么?

【问题讨论】:

  • 你能提供更多代码和更多上下文吗?仅从您的描述来看,几乎不可能回答这个问题。
  • 确保 IncRef 没有被内联,这会禁用断点。
  • IncRef 未内联,断点有效。但是当编辑器被破坏时该函数不会中断,所以我想它没有被调用。
  • 更多代码和上下文.. 不知道具体给出什么。对于游戏引擎来说,这是相当多的代码。我更愿意知道可能出错的可能性。也许是堆损坏?

标签: c++ pointers undefined shared ref


【解决方案1】:

似乎您在某处发生了内存泄漏,甚至可能在这种破坏发生之前很久。我使用 Alleyoop 来查找漏洞。可以提供帮助,不碍事。

您使用多个线程吗?可能是由于在销毁过程中某个地方的某个原始指针被其他线程抓取。

附带说明,我建议使用 boost::intrusive_ptr - 非常方便的模式,用于处理共享对象中的 addref 和释放,有助于随之而来,但这可能无法解决您的问题,除非您遇到了真正的混乱在你的代码中;)

【讨论】:

  • 我使用了错误的表达方式。我的意思是任何类型的内存损坏。也许有某种方式你的对象已经被破坏了(如果你在某处使用原始指针,这是可能的),现在你得到了随机效果。也许某处有一个错误的结构,你正在写你不想写的字段。也许您正在使用一个函数,该函数需要在没有 null 的缓冲区上以 null 结尾的字符串(例如 sscanf、strlen)。可能性是无穷无尽的,都会产生随机效应。
【解决方案2】:

在关闭优化的情况下构建,并在 m_refs 上设置内存断点。

【讨论】:

  • 如何在 m_ref 成员变量上设置断点?所有优化都关闭了,但是当我对成员设置断点时,断点会跳转到下面最近的函数。该成员是私有的,我有公共的 IncRef() 和 Release() 函数,但就像我说的断点表明这些函数以某种方式被破坏了。
  • 您使用的是哪个调试器?在windbg 中,ba 命令(Break on Access)会得到你想要的。在 Visual Studio 中,它被称为数据断点:msdn.microsoft.com/en-us/library/350dyxd0.aspx
  • 谢谢,不知道,我一定会试试这个!但似乎我的程序存在一些堆损坏问题(再次感叹),这可能会导致各种问题。 AppVerifier 已经发现了一些问题。
猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 2014-08-12
  • 2022-01-23
  • 2015-08-12
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
相关资源
最近更新 更多