我在Mac OS X 10.11上使用Swift 2.2进行编程。我有一个看起来像这样的函数:
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 :(得分:0)
经过大量搜索后,答案似乎是因为,根据Apple的说法,内存不受管理,当临时缓冲区“移动”到提供的缓冲区时,编译器在简单指向提供的缓冲区时感觉合理到临时缓冲区指向的内存区域,以便在销毁和释放临时缓冲区时,提供的缓冲区会丢失其内存。无论我尝试了什么,我都无法获得提供的缓冲区来复制缓冲区,因为编译器只是忽略它并分配指针。
显而易见的解决方案是在调用之前将提供的缓冲区包装在Unmanaged NSData对象周围,然后在函数外部保留和释放。但更好的解决方案是不要在函数内部使用临时缓冲区,只需使用提供的缓冲区,然后在调用例程中释放它。