2017-06-10 33 views
1

私はCから文字列を作ろうとしています。私はポインタと長さを持っているので、私はそれをC.GoStringN関数と呼ぶことができます。Cでcgoの文字列を作る

cgoGoString構造体を生成し、私はそれを直接使用することができれば、私は思っていた:

// struct generated by cgo 
typedef struct { const char *p; GoInt n; } GoString; 

// I have s and n from somewhere else, can I do this ? 
const char* s = ... ; // I own this and dont want go to free it 
int n = ... ; 

GoString st = {s, n } ; 

私は、その寿命I制御char*の外出文字列を作るためにhereでこれを使用しています。メモリを再利用するために

//export Nbytes 
func Nbytes(s string) int { 
    ... 
} 

の行くだろうガベージコレクタの試み:GoStringはその後、外出先の関数の引数として使用されていますか?

+0

いいえ、私はGCがメモリを再利用するとは思いません。 'GoString'定義の' const char * p'は、ポインタがGo側によって変更(解放)されないことを意味します。 – putu

答えて

2

Goのガベージコレクタは、Cメモリアロケータを使用して割り当てられたメモリを再利用しようとしません。あなたが記述しているものは安全でなければなりません。もちろん、あなたはCメモリを解放することができないかもしれません。なぜなら、Goがいつそれで完了するか分からないからです。

関連する問題