2017-01-17 2 views
1

Примите следующий код:SecVerifyTransformCreate утечка памяти?

// init 
CFDataRef signature = CFDataCreate(...); 
CFDataRef pubKeyData = CFDataCreate(...); 

CFArrayRef array = NULL; 
OSStatus res = SecItemImport(pubKeyData, ..., &array); 
SecKeyRef pubKey = (SecKeyRef) CFArrayGetValueAtIndex(array, 0); 

// everything goes wrong here 
SecTransformRef verifier = SecVerifyTransformCreate(pubKey, signature, NULL); 

// release 
CFRelease(signature); 
CFRelease(pubKeyData); 
CFRelease(signature); 
CFRelease(verifier); 

Короче: я импортировать открытый ключ и подпись из файла, создавая верификатор для этой подписи. На последующих строках кода я могу успешно проверить подпись.

Что меня волнует утечка памяти, возникающая при вызове метода SecVerifyTransformCreate. Если я прокомментирую эту строку, утечка исчезнет.

Я прочитал все о создать правила и получить правила, и я думаю, что у меня есть высвобождает выяснили.

+0

Как вы установили, что есть утечка памяти? Это просто, что использование памяти приложения идет вверх, или вы собираете это с помощью инструментария? – Frank

+0

Использование памяти приложения увеличивается. Я проверил эту часть кода в цикле, чтобы проверить. Я также проверил с профайлером Xcode (точнее, утечками), который показал, что на самом деле есть утечка по 320 байт на каждую итерацию. Когда строка закомментирована, использование памяти остается неизменным. – honza42

+0

Вы должны быть осторожны в использовании памяти, как сообщается ОС. Распределители памяти часто будут зависеть от выпущенной памяти для последующего повторного использования, поэтому увеличение этой метрики не обязательно означает утечку. При этом, если профайлер сообщает об утечке, то это действительно касается. – Frank

ответ

1

После некоторого обширного тестирования, это то, что я узнал:

Как уже упоминалось в вопросе, в строках ниже код, приведенный выше, я исполняющих верификатор, чтобы проверить, правильно ли подпись, важный метод :

CFTypeRef result = SecTransformExecute(verifier, NULL); 

Если я не включить эту строку кода, есть утечка 320В (на вызов) наблюдается в Instrumentation инструмент Xcode в.

Я полагаю, что метод SecVerifyTransformCreate выделяет некоторую часть памяти и ожидает, что вы звоните SecTransformExecute, который затем выпускает его. Если вы этого не сделаете, произойдет утечка. ИМО - это неправильное поведение.

Как отметил Фрэнк, использование памяти, как сообщается ОС, растет даже без наблюдаемой утечки, но не растет экспоненциально (в моем случае оно остановилось примерно на 40 МБ). Это правильное поведение.

Kudos to Frank для разработки.