3

Cライブラリとインターフェイスするパッケージがあります。次に、C構造体へのポインタをGo構造体に格納する必要があります

type A struct {
  s *C.struct_b
}

明らかに、構造体がGCによって収集される前に、このポインターを解放する必要があります。どうすればそれを達成できますか?

4

1 に答える 1

6

最善の方法は、可能な場合はC構造体をgo制御メモリにコピーすることです。

var ns C.struct_b
ns = *A.s
A.s = &ns

明らかに、それはすべての場合に機能するわけではありません。C.struct_bは複雑すぎるか、Cコード内の何かと共有されている可能性があります。この場合、.Free()または.Close()メソッド(どちらか意味のある方)を作成し、構造体のユーザーがそれを呼び出さなければならないことを文書化する必要があります。Goでは、Freeメソッドを常に安全に呼び出すことができます。たとえば、freeを実行した後は、ユーザーがFreeを2回呼び出してもプログラムがクラッシュしないように、必ずAs=nilに設定してください。

ファイナライザーを作成する方法もあります。私がここに書いた別の答えを参照してください。ただし、常に実行されるとは限らず、ガベージが十分に速く作成される場合、ガベージの作成が収集のペースを上回る可能性があります。これは、Free / Closeメソッドの補足であり、代替ではないと見なす必要があります。

于 2013-02-01T18:15:48.860 に答える