5

C から Vala 関数を呼び出すつもりですが、メモリ管理について質問があります。関数は Vala では次のようになります。

int[] GetNumbers();

valacそして、このようにCに翻訳されます

gint* GetNumbers(int* result_length1);

gint*上記の関数が C から呼び出された場合、呼び出し元は配列を解放する責任がありますか?

4

1 に答える 1

6

ヴァラの質問!なんてかっこいい!

Valaには、-C生成されたCコードを確認できる便利なオプションがあります。この関数、例えば...

int[] GetNumbers() {
    return new int[] {1,2,3};
}

...でコンパイルした場合...

valac -C -c test.vala

...次のCコードを(でtest.c)表示します...

gint* GetNumbers (int* result_length1) {
    gint* result = NULL;
    gint* _tmp0_ = NULL;
    gint* _tmp1_;
    result = (_tmp1_ = (_tmp0_ = g_new0 (gint, 3), _tmp0_[0] = 1, _tmp0_[1] = 2, _tmp0_[2] = 3, _tmp0_), *result_length1 = 3, _tmp1_);
    return result;
}

g_new0;に注意してください そうです、あなたはg_freeそれをしたいのです。

ヘッダーファイルだけを見ていて、すべての実装をわざわざ見ることができない場合でも、Cと同じルールが適用されるように見えます。そうでない場合はconst、解放してください。

于 2010-06-12T22:32:09.880 に答える