如果一个函数返回一个UnsafeMutablePointer,我们有责任销毁和释放吗?

时间:2014-09-01 12:15:30

标签: swift allocation destroy dealloc unsafe-pointers

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

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开发论坛上收到some answers相同的查询。

  

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

     

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

     

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


最终更新:

我现在写了一篇博客文章,概述了关于发布不安全指针的发现和假设,这些指针从StackOverflow,Apple Dev论坛,Twitter和Apple关于分配内存和释放它的旧文档(ARC之前)获取信息。见here

1 个答案:

答案 0 :(得分:4)

来自Swift库UnsafeMutablePointer<T>

  

指向T类型对象的指针。此类型不提供自动化        内存管理,因此用户必须注意分配       和适当的自由记忆

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

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

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