Как мне освободить () после malloc (), когда функция malloc () возвращает функцию? - PullRequest
2 голосов
/ 27 января 2010

У меня есть следующий метод экземпляра (адаптированный из Листинга 3-6 раздела Обработка событий в Руководстве по программированию приложений iPhone):

- (CGPoint)originOfTouch:(UITouch *)touch
{
    CGPoint *touchOriginPoint = (CGPoint *)CFDictionaryGetValue(touchOriginPoints, touch);
    if (touchOriginPoint == NULL)
    {
        touchOriginPoint = (CGPoint *)malloc(sizeof(CGPoint)); // leaks
        CFDictionarySetValue(touchOriginPoints, touch, touchOriginPoint);
        *touchOriginPoint = [touch locationInView:touch.view];
    }
    return *touchOriginPoint;
}

Время от времени мое приложение пропускает 16 байт в результате вызова malloc(). Я не уверен, как вернуть touchOriginPoint, в то время как free() также.

Ответы [ 4 ]

3 голосов
/ 27 января 2010

Если вас не волнует незначительная потеря производительности, используйте NSMutableDictionary и сохраните точку как NSValue:

NSValue* touchOriginPointValue = [touchOriginPoints objectForKey:touch];
if (touchOriginPointValue == nil) {
   touchOriginPointValue = [NSValue valueWithCGPoint:[touch locationInView:touch.view]];
   [touchOriginPoints setObject:touchOriginPointValue forKey:touch];
}
return [touchOriginPointValue CGPointValue];

Если вы должны использовать подход CFDictionary, вы должны найти место для free памяти malloc, когда значения не нужны. Следовательно, вы должны передавать значения обратного вызова при создании словаря

static void free_malloced_memory (CFAllocatorRef allocator, const void *value) {
   free((void*)value);
}
static const CFDictionaryValueCallBacks values_callbacks = {0, NULL, free_malloced_memory, NULL, NULL};
...
touchOriginPoints = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, & values_callbacks);
...
1 голос
/ 27 января 2010

Если вы должны вернуть значение malloc'd из функции, то вы передали ответственность за освобождение памяти вызывающей функции или одному из ее вызывающих.

Поскольку мы не можем видеть вызывающие функции, мы больше не можем диагностировать.

0 голосов
/ 27 января 2010

вы на самом деле не возвращаете указатель, значение копируется в временное значение, когда оно возвращается, так что вы вообще не возвращаете распределение, проблема в том, что вы просто не освобождаете его, Вы добавляете выделение в словарь и просто оставляете его там?

есть ли функция EndOfTouch? где вы убираете тач из словаря? если есть, звоните бесплатно на ваше распределение там, и вы должны быть в порядке

0 голосов
/ 27 января 2010

Если вы собираетесь возвращать объект, который выделен, то либо вам нужно иметь вызывающего free() его, либо вам нужно использовать какую-то сборку мусора (чтобы она автоматически освобождалась).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...