C++ 有时发布后的引用计数很有趣

C++ 有时发布后的引用计数很有趣,c++,cocos2d-x,autorelease,C++,Cocos2d X,Autorelease,我正在使用cocos2dx,对自动释放有一个问题。 我有一个sprite调用autorelease方法,然后删除它的sprite,然后我确认了它的sprite的引用计数,值是14。(实际上,每次都不同) 为什么发布后的引用计数很有趣?这真的是内存释放吗 ↓释放前↓ ↓释放后↓ 在大多数引用计数系统中,当您释放对象上的引用时,您将不再信任指针。在多线程环境中,即使引用计数“before”是10,您也无法知道“after”是9,因为另一个线程可能同时删除(或添加)引用 当最后一次引用计数被释放时,

我正在使用cocos2dx,对自动释放有一个问题。 我有一个sprite调用autorelease方法,然后删除它的sprite,然后我确认了它的sprite的引用计数,值是14。(实际上,每次都不同)

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

↓释放前↓

↓释放后↓


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

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

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

内存已真正释放! 深入研究代码时,您会发现:

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

释放后,内存不再是Ref对象。它可以用于定位其他内容,并且可以修改内存的数据。它不是
\u referenceCount=14
,它可能是
0x00ABC0=0x0000000E

,所以总结一下:您删除了对象上的最后一个引用。然后检查了它的内存,发现引用计数位置中存储了一个奇怪的值。是这样吗?可能是对象被释放了,然后它以前使用的内存位置随后被分配作为不同对象的一部分使用,并被新对象的数据覆盖?(并且包含旧对象引用计数的字节被值14覆盖)@Yakk是的,这是正确的。