gpt4 book ai didi

函数中的 Swift UnsafeMutablePointer 内存分配和释放

转载 作者:行者123 更新时间:2023-11-30 13:19:23 25 4
gpt4 key购买 nike

我正在 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() 方法调用是否是避免内存泄漏所必需的,或者是否无关紧要,因为它是在堆栈上创建的,并且在返回时被销毁?苹果文献说分配的内存需要释放,但是如果释放了我就无法返回有效数据。

也许有更好的方法来做到这一点?函数调用的目的是合并代码以避免重复,因为它是从多个地方调用的,并处理从 dirent 检索的文件名。

谢谢

最佳答案

经过大量搜索,答案似乎是,由于根据 Apple 的说法,内存不受管理,因此当临时缓冲区“移动”到提供的缓冲区时,编译器认为简单地指向提供的缓冲区是合理的到临时缓冲区指向的内存区域,以便当临时缓冲区被销毁和释放时,提供的缓冲区将丢失其内存。无论我尝试什么,我都无法让提供的缓冲区具有复制的缓冲区,因为编译器只是忽略它并分配指针。

显而易见的解决方案是在调用之前将提供的缓冲区包装在非托管 NSData 对象周围,然后在函数外部保留和释放。但更好的解决方案是根本不在函数内部使用临时缓冲区,而只使用提供的缓冲区,然后在调用例程中释放它。

关于函数中的 Swift UnsafeMutablePointer 内存分配和释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37910031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com