2016-06-19 8 views
0

Ich programmiere mit Swift 2.2 unter Mac OS X 10.11. Ich habe eine Funktion, die wie folgt aussieht:Swift UnsafeMutablePointer Speicherzuweisung und Freigabe in einer Funktion

func aFunction(direntPointer: UnsafePointer<dirent>, usingBuffer bufPointer: UnsafeMutablePointer<CChar>) { 
    let tempBuf = UnsafeMutablePointer<CChar>.alloc(2048) 

    ... [put the filename from the dirent into tempBuf and do some processing] 

    // Transfer the data in the temporary buffer into the provided buffer 
    bufPointer.moveAssignFrom(tempBuf, count: 2048) 

    // Seems necessary, but destroys the data in bufPointer as well 
    tempBuf.dealloc(2048) 

    return 
} 

Die BUFPOINTER eingerichtet ist, in einer Aufruffunktion als:

let bufPointer = UnsafeMutablePointer<CChar>.alloc(2048) 

Nach der Rückkehr in die aufrufende Routine, BUFPOINTER keine gültigen Daten enthalten. Wenn ich den Methodenaufruf tempBuf.dealloc() jedoch entferne, enthält tempBuf gültigen Speicher und die Routine funktioniert wie erwartet. Laut der Literatur zerstört die moveAssignFrom() -Methode den Quellspeicher effizienter, indem eine separate move() und dann destroy() ausgeführt wird.

Meine Frage ist, ob der Aufruf der dealloc() -Methode notwendig ist, um einen Speicherverlust zu vermeiden, oder wenn es nicht wichtig ist, weil es auf dem Stapel erstellt wird und gerade bei der Rückkehr zerstört wird? Die Apple-Literatur besagt, dass zugeteilter Speicher freigegeben werden muss, aber ich kann keine gültigen Daten zurückgeben, wenn es freigegeben wird.

Vielleicht gibt es einen besseren Weg, dies zu tun? Der Zweck des Funktionsaufrufs besteht darin, den Code zu konsolidieren, um zu vermeiden, dass er wiederholt wird, da er von mehreren Stellen aufgerufen wird, und um den Dateinamen zu verarbeiten, der von der Dirent abgerufen wird.

Sie

Antwort

0

Nach viel Sucherei danken, scheint die Antwort zu sein, dass da, laut Apple, der Speicher nicht verwaltet wird, wenn der temporäre Puffer „bewegt“ in den bereitgestellten Puffer ist, fühlt sich der Compiler es ist gerechtfertigt, den bereitgestellten Puffer einfach auf den Speicherbereich zu zeigen, auf den der temporäre Puffer zeigt, so dass der bereitgestellte Puffer seinen Speicher verliert, wenn der temporäre Puffer zerstört und freigegeben wird. Egal, was ich versuchte, ich konnte den bereitgestellten Puffer nicht bekommen, um einen kopierten Puffer zu haben, da der Compiler das nur ignorierte und den Zeiger zuordnete.

Die offensichtliche Lösung besteht darin, den bereitgestellten Puffer vor dem Aufruf um ein nicht verwaltetes NSData-Objekt zu wickeln und dann außerhalb der Funktion beizubehalten und freizugeben. Die bessere Lösung besteht jedoch darin, keinen temporären Puffer innerhalb der Funktion zu verwenden und nur den bereitgestellten Puffer zu verwenden und ihn dann in der aufrufenden Routine wieder freizugeben.