Vala управление памятью - PullRequest
5 голосов
/ 13 июня 2010

Я собираюсь вызвать функцию Vala из C, и у меня есть вопрос об управлении памятью.Функция выглядит следующим образом в Vala:

int[] GetNumbers();

и переводится valac в C следующим образом:

gint* GetNumbers(int* result_length1);

Когда вышеупомянутая функция вызывается из C, отвечает ли вызывающийза освобождение массива gint*?

1 Ответ

6 голосов
/ 13 июня 2010

Вала вопрос!Как здорово!

В 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 it.

Даже если вы просто пользуетесь файлом заголовка и не можете потрудиться взглянуть на каждую реализацию, похоже, применяются те же правила, что и вC: если это не const, освободи его.

...