#c #memory-leaks #cocos2d-x #autorelease
#c #утечки памяти #cocos2d-x #автозапуск
Вопрос:
Я не знаю реальной разницы между этими двумя макросами в Cocos2d-x
CC_SAFE_DELETE
и CC_SAFE_RELEASE_NULL
Кто-нибудь может мне это объяснить? Вероятно, это может решить несколько утечек памяти, которые у меня есть в моей игре.
Вот пример того, где я хочу это использовать.
CoolLayer * CoolLayer::create()
{
CoolLayer * pRep = new CoolLayer();
if (pRep amp;amp; pRep->init() )
{
pRep->autorelease();
}
else
{
CC_SAFE_DELETE(pRep);
}
return pRep;
}
Заранее спасибо.
Ответ №1:
CC_SAFE_DELETE определяется как
do { delete (p); (p) = nullptr; } while(0)
в основном используется для удаления обычных объявленных объектов c , которые вы хотите удалить.
CC_SAFE_RELEASE определяется как
do { if(p) { (p)->release(); } } while(0)
(редактировать только что понял, что ваш вопрос касается CC_SAFE_RELEASE_NULL, это точно то же самое, за исключением того, что он также обнуляет ваш указатель)
Это уменьшит количество ссылок ваших объектов cocos2d-x, которое используется конструкцией подсчета ссылок cocos2d-x, если объект достигает количества ссылок, равного 0, он будет удален для вас.
Используйте безопасное удаление для стандартных объектов c , таких как векторы или массивы, или какими бы ни были ваши пользовательские классы. Используйте безопасный выпуск для всего, что наследуется от cocos2d::Object, поскольку в нем встроен собственный подсчет ссылок, что немного упрощает отслеживание ссылок на ваши объекты.
Если вы не знакомы с подсчетом ссылок, это связано с тем фактом, что cocos2d изначально был создан в objective-c, где подсчет ссылок является нормой, поэтому после переноса они продолжали использовать его для всех своих собственных объектов.
Комментарии:
1. забыл упомянуть, что противоположность release заключается в том, что retain увеличивает количество ссылок, release уменьшает его. Если вы никогда не вызываете retain , нет причин когда-либо выпускать, просто используйте delete.
2. Ах! Отлично, вы разрешили мои сомнения этим последним комментарием, большое спасибо.
3. Не уверен, почему вы вообще хотели использовать SAFE_RELEASE вместо SAFE_RELEASE_NULL, поскольку это дает вам потенциальный доступ к объекту, который мог быть удален (а мог и нет). Это ситуация, которую я видел, и мне любопытно посмотреть, какой эффект замена всех SAFE_RELEASEs на SAFE_RELEASE_NULLs оказывает на движок.