Как найти причину ошибки malloc "double free"? - PullRequest
80 голосов
/ 09 июня 2009

Я программирую приложение в Objective-C и получаю эту ошибку:

MyApp (2121,0xb0185000) malloc: & ast; ** ошибка для объекта 0x1068310: двойное освобождение
*** установить точку останова в malloc_error_break для отладки

Это происходит, когда я выпускаю NSAutoreleasePool, и я не могу понять, какой объект я выпускаю дважды.

Как мне установить его точку останова?

Есть ли способ узнать, что это за "объект 0x1068310"?

Ответы [ 13 ]

0 голосов
/ 18 мая 2011

Если malloc_error_break не помогает ...

Лучший способ устранить эту ошибку - запустить инструменты с включенным NSZombies. Инструменты будут помечать вас, когда зомби обмениваются сообщениями, и вы можете проследить прямо к строке кода.

Требуется снежный барс, какой спасатель!

0 голосов
/ 29 июня 2009

Чтобы найти такого рода проблемы с памятью и указателями в целом, вы хотите запустить свой код для проверки ошибок памяти во время выполнения, такой как Valgrind . Это должно быть в состоянии указать на многие вещи, которые ваш код делает неправильно, кроме тех, которые вызывают его сбой.

Valgrind может работать на OSX (хотя он говорит, что он "не поддерживается, неполон и содержит ошибки"), и с небольшим взломом кто-то заставил его работать с исполняемыми файлами iPhone SDK .

Еще лучше, вы можете попробовать инструменты, которые являются частью XCode. Здесь есть учебник по запуску здесь .

0 голосов
/ 09 июня 2009

В Xcode, нажмите слева от номера строки, чтобы установить точку останова. Затем вы можете запустить его, выполнив «Build and Debug».

Рекомендуется, чтобы созданный вами объект не был autorelease, поскольку память на iPhone является товаром. Apple рекомендует явно звонить release.

...