Управление памятью Vala

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

int[] GetNumbers();

и переводится valac к C как это

gint* GetNumbers(int* result_length1);

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

5
задан dzhelil 12 June 2010 в 21:45
поделиться

1 ответ

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

У Vala есть полезная опция -C, которая позволяет вам взглянуть на генерируемый ею Си-код. Например, эта функция...

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

... при компиляции с...

valac -C -c test.vala

... покажет следующий Си-код (в 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, освободите его.

6
ответ дан 14 December 2019 в 13:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: