Нахождение утечек памяти

Утечки памяти являются блоками выделенной памяти что программа больше ссылки. Утечки тратят впустую пространство путем заполнения страниц памяти с недоступными данными и напрасно тратят время вследствие дополнительного действия разбивки на страницы. Пропущенная память в конечном счете вынуждает систему выделить дополнительные страницы виртуальной памяти для приложения, выделения которого, возможно, избежали путем предъявления претензий в отношении пропущенной памяти.

Для приложений, использующих malloc, утечки памяти являются ошибками и должны всегда фиксироваться. Для приложений, использующих только объекты Objective C, функция ARC компилятора освобождает объекты для Вас и обычно избегает проблемы утечек памяти. Однако приложения, смешивающие использование объектов Objective C и структур на базе С, должны управлять владением объектов более непосредственно, чтобы гарантировать, что не пропущены объекты.

malloc библиотека может только предъявить претензии в отношении памяти, в отношении которой Вы говорите ей предъявлять претензии. Если Вы вызываете malloc или любая подпрограмма, выделяющая память, необходимо сбалансировать тот вызов с соответствия free. Когда Вы забываете освобождать память для указателя, встроенного в структуру данных, происходит типичная утечка памяти. При выделении памяти для встроенных указателей в коде удостоверьтесь, что Вы выпускаете память для того указателя до освобождения самой структуры данных.

Другой типичный пример утечки памяти происходит, когда Вы выделяете память, присваиваете ее указателю, и затем присваиваете различное значение указателю, не освобождая первый блок памяти. В этом примере, перезаписывая адрес в указателе стирает ссылку на исходный блок памяти, лишая возможности выпускать.

Нахождение утечек Используя инструменты

Инструментальное приложение может использоваться для нахождения утечек и в OS X и в приложениях для iPhone. Для нахождения утечек создайте новый шаблон документа в Инструментах и добавьте инструмент Утечек к нему. Инструмент Утечек обеспечивает возможности обнаружения утечки, идентичные тем в leaks инструмент командной строки. Инструмент Утечек записывает все события выделения, происходящие в Вашем приложении, и затем периодически ищет перезаписываемую память приложения, регистры и штабель для ссылок на любые блоки активной памяти. Если это не находит ссылку на блок в одном из этих мест, это считает блок «утечкой» и выводит на экран релевантную информацию в области Detail.

В области Detail можно просмотреть пропущенную Таблицу использования блоков памяти и Режимы контуров. В режиме Table Инструменты выводят на экран полный список пропущенных блоков, сортированных размером. Выбор записи в таблице и щелчок по кнопке стрелки рядом с адресом памяти показывают историю выделения для блока памяти в том адресе. Выбор записи от этой истории выделения тогда показывает отслеживание стека для того события в области Extended Detail окна документа. В Режиме контуров, утечки приборных панелей Утечек, организованные деревом вызова, которое можно использовать для получения информации об утечках в определенном ответвлении кода.

Для получения дополнительной информации об использовании Инструментального приложения, включая большую информацию об информации, выведенной на экран инструментом Утечек, см. Инструментальное Руководство пользователя.

Используя Инструмент утечек

В OS X, leaks инструмент командной строки ищет пространство виртуальной памяти процесса для буферов, выделенных malloc но больше не ссылаются. Для каждого пропущенного буфера это находит, leaks дисплеи следующая информация:

Если leaks может решить, что объект является экземпляром Objective C или Базового объекта Основы, он также выводит на экран имя объекта. Если Вы не хотите просматривать содержание каждого пропущенного буфера, можно указать -nocontext опция при вызове leaks. Если MallocStackLogging переменная окружения установлена, и Вы запускаете свое приложение в gdb, leaks выводит на экран отслеживание стека, описывающее, где был выделен буфер. Для получения дополнительной информации о malloc параметры отладки, посмотрите Включение Функций отладки Malloc.

Подсказки для улучшения обнаружения утечки

Следующие инструкции могут помочь Вам найти утечки памяти быстро в Вашей программе. Большинство этих инструкций предназначается, чтобы использоваться с leaks инструмент, но некоторые также применимы для использования с MallocDebug и общего использования.

Большая часть кода поблочного тестирования выполняет желаемые пути выполнения кода и выходы. Несмотря на то, что это совершенно нормально для поблочного тестирования, оно создает проблему для leaks инструмент, которому требуется время для анализа пространства памяти процесса. Для решения этой проблемы необходимо удостовериться, что код поблочного тестирования не выходит непосредственно после завершения его тестов. Можно сделать это путем помещения процесса для сна неопределенно вместо того, чтобы обычно выйти.