Невозможно освободить связанный список в iPhone-устройстве для target-C - PullRequest
0 голосов
/ 17 мая 2011

Я пишу приложение для iPhone, которое использует связанный список для отслеживания набора точек. Я снова и снова успешно использовал связанные списки в других программах на Си, но я никогда не использовал связанный список на iPhone, и моя функция 'freeList' дает сбой.

pointNode * temp;

pointTrain = lPoints->next;
while (pointTrain) {
    temp = pointTrain->next;
    free(pointTrain);
    pointTrain = temp;
}

Вот как я освобождаю свой список, lPoints - это заголовок, который всегда выделяется во время выполнения. Этот код выполняется до добавления еще каких-либо узлов, но он все еще выполняется, хотя «pointTrain» имеет значение NULL, что ДОЛЖНО заставить его пропустить цикл while. К сожалению, цикл все еще выполняется, и программа аварийно завершает работу (pointTrain)

Есть что-то, чего я просто не вижу?

Очки добавляются в цикле следующим образом:

pointTrain->x = onPx / trueWidth;
pointTrain->y = onPx % trueWidth;
pointTrain->next = (pointNode*)malloc(sizeof(pointNode));
pointTrain = pointTrain->next;

Ответы [ 2 ]

4 голосов
/ 17 мая 2011

Один мудрец однажды сказал: «Я бы лучше поехал на лошади в том направлении, в котором она движется».

Не катите свою собственную структуру, когда есть очень хороший класс NSMutableArray, который вы могли бы использовать. Линейная итерация массива дешева и проста, и у класса есть свои собственные хуки управления памятью, и все, что вам нужно сделать, это ИСПОЛЬЗОВАТЬ их.

Это то, что я часто вижу с разработчиками C и C ++, которые переходят на Objective-C. Следующий проект на моей тарелке - развернуть проект, над которым ОЧЕНЬ старший C ++ парень провел последние шесть месяцев. Глядя на код, ясно, что он провел почти все это время, споря со структурой. На данный момент он практически создал свою собственную структуру.

2 голосов
/ 17 мая 2011

Вы явно инициализируете рядом с NULL или nil?

Если нет, то, скорее всего, ему уже будет присвоено какое-то ненулевое значение, и поэтому while (pointTrain) все равно будет иметь значение true.

...