17

例如,如果我要编写这段代码:

var t = time_t()
time(&t)
let x = localtime(&t) // returns UnsafeMutablePointer<tm>
        
println("\(x.memory.tm_hour): \(x.memory.tm_min): \(x.memory.tm_sec)")

...是否还需要执行以下操作?

x.destroy()
x.dealloc(1)

还是我们没有分配内存,因此不需要关闭它?


更新#1:

如果我们想象一个返回 的函数UnsafeMutablePointer

func point() -> UnsafeMutablePointer<String> {
    let a = UnsafeMutablePointer<String>.alloc(1)
    a.initialize("Hello, world!")
    return a
}

调用这个函数会产生一个指向一个永远不会被销毁的对象的指针,除非我们自己做脏活。

我在这里问的问题:从呼叫中收到的指针有localtime()什么不同吗?
模拟器和操场都使我们能够向dealloc(1)返回的指针发送一个调用,但是我们应该这样做还是稍后会通过其他方法对返回的指针进行释放?

目前,我错误地认为我们确实需要销毁和解除分配。

更新 #1.1:

最后一个假设是错误的。我不需要释放,因为我没有创建对象。


更新#2:

我在 Apple 开发者论坛上收到了相同查询的一些答案。

一般来说,您的问题的答案是肯定的。如果您收到一个指向内存的指针,您将负责在 C 中释放它,那么您仍然有责任在从 swift 调用时释放它...... [但是]在这种特殊情况下,您无需执行任何操作。(JQ)

例程本身为结果维护静态内存,您不需要释放它们。(如果你这样做可能是一件“坏事”)......一般来说,你不知道是否需要释放 UnsafePointer 指向的东西......这取决于该指针从何处获得其值。(英石)

UnsafePointer 的 dealloc() 与 free() 不兼容。将 alloc() 与 dealloc() 和 malloc 配对。与免费()。如前所述,您正在调用的函数应该告诉您是否是您对释放结果的响应...... 只有当指针引用的内存中有非平凡的内容*时,destroy() 才是必需的,例如强引用或 Swift 结构或枚举。一般来说,如果它来自 C,你可能不需要 destroy() 它。(事实上​​,你可能不应该 destroy() 它,因为它不是由 Swift 初始化的。) ... * “非平凡的内容”不是 Swift 的官方术语。我将它与“平凡可复制”的 C++ 概念类比使用(尽管不一定是“平凡的”)。(STE)


最终更新:

我现在写了一篇博文,概述了我关于释放不安全指针的发现和假设,这些指针从 StackOverflow、Apple 开发论坛、Twitter 和 Apple 关于分配内存和释放它的旧文档(pre-ARC)获取板载信息。见这里

4

1 回答 1

4

来自 Swift 库UnsafeMutablePointer<T>

指向类型对象的指针T。这种类型不提供自动内存管理,因此用户必须注意适当地分配和释放内存

指针可以处于以下状态之一:

  • 未分配内存(例如,指针为空,或内存已被之前释放);
  • 内存已分配,但值尚未初始化;
  • 分配内存并初始化值。

struct UnsafeMutablePointer<T> : RandomAccessIndexType, Hashable, NilLiteralConvertible { /**/}

于 2014-09-01T12:20:37.803 回答