3

Go で C 変数を使用している場合、どの変数を解放する必要があるかについて混乱しています。

たとえば、これを行うと:

    s := C.CString(`something`)

そのメモリは、私が呼び出すまで割り当てられていますC.free(unsafe.Pointer(s))か、それとも関数が終了したときにGoによってガベージコレクションされても問題ありませんか?

それとも、解放する必要があるのは、インポートされた C コードから作成された変数のみであり、Go コードから作成されたこれらの C 変数はガベージ コレクションの対象になりますか?

4

1 に答える 1

6

ドキュメントには次のことが記載されています。

// Go string to C string
// The C string is allocated in the C heap using malloc.
// It is the caller's responsibility to arrange for it to be
// freed, such as by calling C.free (be sure to include stdlib.h
// if C.free is needed).
func C.CString(string) *C.char

ウィキは例を示しています:

package cgoexample

/*
#include <stdio.h>
#include <stdlib.h>

void myprint(char* s) {
        printf("%s", s);
}
*/
import "C"

import "unsafe"

func Example() {
        cs := C.CString("Hello from stdio\n")
        C.myprint(cs)
        C.free(unsafe.Pointer(cs))
}

記事「C?Go?Cgo!」は、C の数値型を解放する必要がないことを示しています。

func Random() int {
    var r C.long = C.random()
    return int(r)
}

ただし、文字列の場合は次のようになります。

import "C"
import "unsafe"

func Print(s string) {
    cs := C.CString(s)
    C.fputs(cs, (*C.FILE)(C.stdout))
    C.free(unsafe.Pointer(cs))
}
于 2014-10-04T06:47:34.480 に答える