Я использую cocos2dx, и у меня есть вопрос об авто-выпуске.
У меня есть метод автоматического освобождения вызова спрайта, после чего я удалил его спрайт, и затем я подтвердил счетчик ссылок его спрайта, значение было 14. (На самом деле, каждый раз оно отличается).
Почему подсчет ссылок после релиза смешной? Это действительно память выпущена?
↓ Перед выпуском ↓
↓ После выпуска ↓
В большинстве систем подсчета ссылок, когда вы отпускаете ссылку на объект, вы больше не можете доверять указателю. В многопоточной среде, даже если счетчик ссылок «до» был 10, вы не можете знать, что «после» он равен 9, потому что другой поток мог одновременно удалять (или добавлять) ссылки.
Когда последний счетчик ссылок выпущен, объект обычно перерабатывается. Может быть это free
д или delete
d, или, возможно, он возвращается в какую-то другую систему управления ресурсами. Иногда память, в которой используется объект, перезаписывается бухгалтерской информацией, пока он ожидает повторного использования, в других случаях он сразу же используется повторно, прежде чем вы сможете увидеть его снова.
Чтение или запись по указателю, на который вы сбросили счетчик ссылок, не должны выполняться.
Когда вы исследуете глубже код, вы найдете это:
void Ref::release() { // CCRef.cpp
...
if (_referenceCount == 0)
delete this;
...
}
После освобождения память больше не является объектом Ref. Он может использоваться для поиска чего-то другого, и данные этой памяти могут быть изменены. Это не _referenceCount = 14
может быть 0x00ABC0 = 0x0000000E
,