2015-06-24 9 views
5

Ich verwende die Bridging Header-Funktion des Swift-Compilers, um eine C-Funktion aufzurufen, die Speicher unter Verwendung von malloc() zuweist. Es gibt dann einen Zeiger auf diesen Speicher zurück. Der Funktionsprototyp ist so etwas wie:Free C-malloc() 'Speicher in Swift?

char *the_function(const char *); 

In Swift, ich benutze es wie folgt aus:

var ret = the_function(("something" as NSString).UTF8String) 

let val = String.fromCString(ret)! 

Verzeihen Sie meine Unwissenheit über Swift aber in der Regel in C, wenn the_function() ist malloc'ing Speicher und es zurückgeben, muss jemand anderes() es irgendwann befreien.

Wird dies von Swift irgendwie gehandhabt oder lecke ich Speicher in diesem Beispiel?

Vielen Dank im Voraus.

Antwort

5

Swift nicht gelingt, Speicher, der mit malloc() zugeordnet ist, müssen Sie eventuell den Speicher frei:

let ret = the_function("something") // returns pointer to malloc'ed memory 
let str = String.fromCString(ret)! // creates Swift String by *copying* the data 
free(ret) // releases the memory 

println(str) // `str` is still valid (managed by Swift) 

Beachten Sie, dass ein Swift String automatisch auf einen UTF-8 Zeichenfolge umgewandelt wird, wenn übergeben zu einer C-Funktion, die einen const char * Parameter wie in String value to UnsafePointer<UInt8> function parameter behavior beschrieben. Deshalb

let ret = the_function(("something" as NSString).UTF8String) 

kann

let ret = the_function("something") 
+0

macht Sinn vereinfacht werden, danke! – Christopher