В Cocos2d-x в чем разница между CC_SAFE_DELETE и CC_SAFE_RELEASE_NULL?

#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 оказывает на движок.