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

ske*_*ech 16 allocation unsafe-pointers dealloc destroy swift

例如,如果我要编写此代码:

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)")
Run Code Online (Sandbox Code Playgroud)

......是否还需要做以下事情?

x.destroy()
x.dealloc(1)
Run Code Online (Sandbox Code Playgroud)

或者我们没有分配内存,因此不需要解雇它?


更新#1:

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

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

调用此函数将导致指向一个永远不会被销毁的对象的指针,除非我们自己做脏工作.

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

目前我错误地认为我们确实需要销毁和释放.

更新#1.1:

最后的假设是错误的.我不需要发布,因为我没有创建对象.


更新#2:

我在Apple dev论坛上收到了相同查询的一些答案.

一般来说,你的问题的答案是肯定的.如果你收到一个指向你将负责在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之前)获取信息.看到这里.

Max*_*tin 4

来自 Swift 库UnsafeMutablePointer<T>

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

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

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

struct UnsafeMutablePointer<T> : RandomAccessIndexType, Hashable, NilLiteralConvertible { /**/}
Run Code Online (Sandbox Code Playgroud)