Я собираюсь вызвать функцию Vala от C, и у меня есть вопрос об управлении памятью. Функция похожа на это в Vala:
int[] GetNumbers();
и переводится valac
к C как это
gint* GetNumbers(int* result_length1);
То, когда вышеупомянутая функция вызвана от C, является вызывающей стороной, ответственной за освобождение gint*
массив?
Вопрос от 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
, освободите его.