Si una función devuelve un UnsafeMutablePointer, ¿es nuestra responsabilidad destruir y desasignar?

Por ejemplo, si tuviera que escribir este código:

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)")

... ¿también sería necesario hacer lo siguiente?

x.destroy()
x.dealloc(1)

¿O no asignamos la memoria y, por lo tanto, no necesitamos descartarla?

Actualización n. ° 1:

Si imaginamos una función que devuelve unUnsafeMutablePointer:

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

Llamar a esta función daría como resultado un puntero a un objeto que nunca se destruirá a menos que hagamos el trabajo sucio nosotros mismos.

La pregunta que hago aquí: Es un puntero recibido de unlocaltime() ¿Llamas diferente?
El simulador y el patio de recreo nos permiten enviar unodealloc(1) llamar al puntero devuelto, pero ¿deberíamos hacer esto o la desasignación va a suceder para un puntero devuelto por algún otro método en un momento posterior?

En este momento estoy errando hacia la suposición de que necesitamos destruir y desaprovechar.

Actualización n. ° 1.1:

La última suposición estaba equivocada. No necesito liberar, porque no creé el objeto.

Actualización n. ° 2:

recibíalgunas respuestas a la misma consulta en los foros de desarrollo de Apple.

En general, la respuesta a su pregunta es sí. Si recibe un puntero a la memoria que sería responsable de liberar en C, entonces todavía es responsable de liberarlo cuando llame desde Swift ... [Pero] en este caso particular no necesita hacer nada. (JQ)

la rutina en sí misma mantiene memoria estática para el resultado y no necesita liberarlos. (probablemente sería una "cosa mala" si lo hiciera) ... En general, no puede saber si necesita liberar algo señalado por un puntero inseguro ... depende de dónde obtenga su valor ese puntero. (S T)

Dealloc () de UnsafePointer no es compatible con free (). Empareje alloc () con dealloc () y malloc y co. con gratis (). Como se señaló anteriormente, la función que está llamando debería decirle si es su respuesta para liberar el resultado ... destroy () solo es necesario si tiene contenido no trivial * en la memoria a la que hace referencia el puntero, como una referencia fuerte o una estructura o enumeración Swift. En general, si vino de C, probablemente no necesite destruirlo (). (De hecho, probablemente no deberías destruirlo () porque Swift no lo inicializó) ... * "contenido no trivial" no es un término oficial de Swift. Lo estoy usando por analogía con la noción C ++ de "trivialmente copiable" (aunque no necesariamente "trivial"). (STE)

Actualización final:

Ahora he escrito una publicación de blog que describe mis hallazgos y suposiciones con respecto al lanzamiento de punteros inseguros que toman información a bordo de StackOverflow, los foros de desarrollo de Apple, Twitter y la documentación antigua de Apple sobre la asignación de memoria y su liberación, antes del ARC. Veraquí.

Respuestas a la pregunta(1)

Su respuesta a la pregunta