【问题标题】:Sometimes a reference count after release is funny有时发布后的引用计数很有趣
【发布时间】:2018-02-08 17:53:55
【问题描述】:

我正在使用 cocos2dx,并且有一个关于 autorelease 的问题。 我有一个精灵调用autorelease方法,然后删除它的精灵,然后我确认了它的精灵的引用计数,值为14。(实际上每次都不一样)。

为什么发布后的引用计数很有趣?这真的是内存释放了吗?

↓发布前↓

↓发布后↓

【问题讨论】:

  • 总结一下:您删除了对象的最后一个引用。然后你检查了它的内存,发现引用计数位置存储了一个奇怪的值。是这样的吗?
  • 也许该对象已被释放,然后它之前使用的内存位置随后被分配用作不同对象的一部分,并被新对象的数据覆盖? (并且包含旧对象引用计数的字节被值 14 覆盖)
  • @Yakk 是的,没错。

标签: c++ cocos2d-x autorelease


【解决方案1】:

在大多数引用计数系统中,当您释放对对象的引用时,您将不再信任您的指针。在多线程环境中,即使“之前”的引用计数为 10,您也无法知道“之后”为 9,因为另一个线程可能同时删除(或添加)引用。

当最后一个引用计数被释放时,对象通常会被回收。可能是freed 或deleted,也可能是返回到其他资源管理系统。有时,对象使用的内存在等待重用时会被簿记信息覆盖,有时它会在您再次看到它之前立即重用。

不应从已释放引用计数的指针读取或写入。

【讨论】:

    【解决方案2】:

    内存真正释放了!

    当您更深入地检查代码时,您会发现:

    void Ref::release() { // CCRef.cpp
    ...
        if (_referenceCount == 0)
            delete this; 
    ...
    }
    

    释放后,内存不再是 Ref 对象。它可以用来定位其他东西,并且可以修改内存的数据。不是_referenceCount = 14,可能是0x00ABC0 = 0x0000000E

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 1970-01-01
      • 2017-06-11
      相关资源
      最近更新 更多