2016-03-31 16 views
1

ich den folgenden Code in Go haben, die CGO verwendet:Garbage Collection in CGO

func foo() { 
     bar := new(C.struct_bar) 
     ... 
    } 

Wird Müll gesammelt bar, nachdem die Funktion ihre Ausführung beendet oder muss ich ausdrücklich frei anrufen?

Antwort

4

Ja, obwohl der struct_bar ein C-Typ ist, wird der Speicher von Go zugewiesen und von Go gesammelt.

Jeder in C zugewiesene Speicher wird jedoch vom Go GC nicht verfolgt. Der C-Code sollte dies selbst verwalten, aber in Fällen wie C.CString, bei denen Go die Zuweisung auslöst, müssen Sie den Speicher manuell mit C.free freigeben.

+0

Ein Follow-up, wenn ich einen C Char Zeiger mit Punkt: = neu (C.char) zugewiesen und dann übergeben es als Argument an eine C-Funktion, die etwas Speicher für diesen Zeiger zugewiesen, dann würde dieser Speicher freigegeben werden durch den Müllsammler oder nein? – user2424276

+2

@ user2424276: 'new (C.char)' weist ein einzelnes Byte zu, das später vom GC erfasst wird. Wenn die C-Funktion den Speicher zuweist, weisen Sie in go nichts zu, geben Sie einfach einen Zeiger ein. – JimB