Wenn eine Funktion einen UnsafeMutablePointer zurückgibt, liegt es in unserer Verantwortung, zu zerstören und die Zuordnung aufzuheben?

Zum Beispiel, wenn ich diesen Code schreiben würde:

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

... müsste man auch folgendes machen?

x.destroy()
x.dealloc(1)

Oder haben wir den Speicher nicht reserviert und müssen ihn daher nicht entlassen?

Update # 1:

Wenn wir uns eine Funktion vorstellen, die ein @ zurückgiUnsafeMutablePointer:

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

as Aufrufen dieser Funktion würde zu einem Zeiger auf ein Objekt führen, das niemals zerstört wird, es sei denn, wir erledigen die Drecksarbeit selbst.

Die Frage, die ich hier stelle: Wird ein Zeiger von einem @ empfangelocaltime() anders anrufen?
er Simulator und der Spielplatz ermöglichen es uns, einen zu sendedealloc(1) Aufruf des zurückgegebenen Zeigers, aber sollten wir dies tun oder wird die Freigabe eines zurückgegebenen Zeigers zu einem späteren Zeitpunkt durch eine andere Methode erfolgen?

Im Moment irre ich mich in Richtung der Annahme, dass wir zerstören und die Zuordnung aufheben müssen.

Update # 1.1:

Die letzte Annahme war falsch. Ich muss nicht freigeben, da ich kein Objekt erstellt habe.

Update # 2:

Ich erhielteinige Antworten zur selben Abfrage in den Apple-Entwicklerforen.

Im Allgemeinen lautet die Antwort auf Ihre Frage "Ja". Wenn Sie einen Zeiger auf den Speicher erhalten, für dessen Freigabe Sie in C verantwortlich wären, sind Sie weiterhin dafür verantwortlich, ihn freizugeben, wenn Sie von swift ... [Aber] aus aufrufen. In diesem speziellen Fall müssen Sie nichts tun. (JQ)

die Routine selbst verwaltet den statischen Speicher für das Ergebnis, und Sie müssen sie nicht freigeben. (Es wäre wahrscheinlich eine "schlechte Sache", wenn Sie dies getan hätten.) Im Allgemeinen können Sie nicht wissen, ob Sie etwas freigeben müssen, auf das ein UnsafePointer zeigt. Es hängt davon ab, woher dieser Zeiger seinen Wert bezieht. (ST)

Dealloc () von UnsafePointer ist nicht kompatibel mit free (). Pair alloc () mit dealloc () und malloc and co. mit free (). Wie bereits erwähnt, sollte die von Ihnen aufgerufene Funktion Ihnen mitteilen, ob es Ihre Antwort ist, das Ergebnis freizugeben ... destroy () ist nur erforderlich, wenn Sie nicht-triviale Inhalte * im Speicher haben, auf die der Zeiger verweist, wie z eine starke Referenz oder eine schnelle Struktur oder Aufzählung. Wenn es von C stammt, müssen Sie es im Allgemeinen wahrscheinlich nicht zerstören (). (Tatsächlich sollten Sie es wahrscheinlich nicht zerstören (), da es nicht von Swift initialisiert wurde.) ... * "Nicht-trivialer Inhalt" ist kein offizieller Swift-Begriff. Ich verwende es analog zum C ++ - Begriff "trivial kopierbar" (wenn auch nicht unbedingt "trivial"). (STE)

Endgültiges Update:

Ich habe jetzt einen Blogpost geschrieben, in dem meine Erkenntnisse und Annahmen bezüglich der Veröffentlichung von unsicheren Zeigern dargelegt werden. Dabei werden Informationen aus StackOverflow, Apple Dev Forums, Twitter und Apples alter Dokumentation zur Speicherzuweisung und -freigabe vor ARC herangezogen. SehenHie.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage