Как описано в заголовке, я пишу UDF на языке C PostgreSQL. Я вызываю некоторые функции с помощью DirectFunctionCall1
, DirectFunctionCall2
, ... Некоторые из этих функций возвращают POD (например, interval_finite
, timestamp_in
), в то время как некоторые из них возвращают указатели (например, interval_in
, int4_to_char
).
Q1: После того, как я вызову эти функции, возвращающие указатели, я должен вызвать pfree
, чтобы освободить эти указатели?
Q2: Если ответом на вопрос Q1 является «да», следует ли мне освобождать эти указатели в Q1 после передачи указателей на другие функции DirectFunctionCall1
в качестве параметров?
Interval *real_interval = NULL;
real_interval = DatumGetIntervalP(DirectFunctionCall2(
timestamp_mi,
TimestampTzGetDatum(timestamp_floor_small_period),
TimestampTzGetDatum(timestamp_floor_big_period)));
// Q1: should I call pfree(real_interval)?
result = DatumGetInt32(
DirectFunctionCall1( // Q2: Should I free the returned pointer of DirectFunctionCall?
numeric_int4,
DirectFunctionCall2( // Q2: Should I free the returned pointer of DirectFunctionCall?
numeric_div,
NumericGetDatum(
DatumGetNumeric(
DirectFunctionCall1( // Q2: Should I free the returned pointer of DirectFunctionCall?
intervaltonum,
IntervalPGetDatum(real_interval)
)
)
),
NumericGetDatum(
DatumGetNumeric(
DirectFunctionCall1( // Q2: Should I free the returned pointer of DirectFunctionCall?
intervaltonum,
IntervalPGetDatum(&small_interval)
)
)
)
)
)
);