2016-06-19 2 views
0

Я программирую с помощью Swift 2.2 на Mac OS X 10.11. У меня есть функция, которая выглядит следующим образом:Swift UnsafeMutablePointer распределение памяти и освобождение в функции

func aFunction(direntPointer: UnsafePointer<dirent>, usingBuffer bufPointer: UnsafeMutablePointer<CChar>) { 
    let tempBuf = UnsafeMutablePointer<CChar>.alloc(2048) 

    ... [put the filename from the dirent into tempBuf and do some processing] 

    // Transfer the data in the temporary buffer into the provided buffer 
    bufPointer.moveAssignFrom(tempBuf, count: 2048) 

    // Seems necessary, but destroys the data in bufPointer as well 
    tempBuf.dealloc(2048) 

    return 
} 

bufPointer настроенное в вызывающей функции, как:

let bufPointer = UnsafeMutablePointer<CChar>.alloc(2048) 

После возвращения к вызывающей программе, bufPointer не содержит действительные данные. Однако, если я удаляю вызов метода tempBuf.dealloc(), то tempBuf содержит допустимую память, и процедура работает, как и ожидалось. Согласно литературе, метод moveAssignFrom() более эффективно разрушает исходную память, делая отдельный move(), а затем destroy().

Мой вопрос в том, нужен ли вызов метода dealloc(), чтобы избежать утечки памяти или если это не имеет значения, потому что оно создается в стеке и просто уничтожается при возврате? В литературе Apple говорится, что выделенная память должна быть освобождена, но я не могу вернуть достоверные данные, если она освобождена.

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

Спасибо

ответ

0

После долгих поисков, ответ, кажется, что, так как, по мнению Apple, память не удалось, когда временный буфер «перемещается» в поставленном буфер, компилятор чувствует что просто указывая предоставленный буфер на область памяти, на которую указывает временный буфер, так что, когда временный буфер уничтожается и освобождается, предоставленный буфер теряет свою память. Независимо от того, что я пытался, я не мог получить предоставленный буфер, чтобы иметь скопированный буфер, поскольку компилятор просто игнорировал это и назначал указатель.

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

Смежные вопросы