Если кто-то должен был объявить план как таковой, то немедленно уничтожить его, существует ли риск возникновения сегментации?
fftw_plan myPlan;
fftw_destroy_plan(myPlan);
Может быть, мое чувство кишки, но я не знаю, делает ли fftw какую-либо внутреннюю бухгалтерскую отчетность на этих вещах, чтобы избежать освобождения нераспределенной памяти.
Да, есть риск. Это, по-видимому, определение fftw_destroy_plan
в FFTW 3.3.3:
void X(destroy_plan)(X(plan) p)
{
if (p) {
X(plan_awake)(p->pln, SLEEPY);
X(plan_destroy_internal)(p->pln);
X(problem_destroy)(p->prb);
X(ifree)(p);
}
}
Он использует план p
как указатель. Итак, если p
неинициализируется, поведение, не определенное стандартными результатами C.
Даже если мы рассматриваем теоретические альтернативные реализации FFTW, а не фактический код, существует риск. Поскольку содержимое myPlan
неконтролируемо, они могут оказаться идентичными действительному плану FFTW, и в этом случае fftw_destroy_plan
попытается его уничтожить. Это почти наверняка подразумевает free
обращение к указателям в плане, даже если мы рассматриваем теоретические альтернативные реализации FFT, а не фактический код.
Теоретически возможно, что API FFTW может быть реализован с фиксированным объемом пространства в плане (при этом fftw_plan
является большой struct
а не указателем), так что распределение динамической памяти необязательно, и free
не используется. Однако тогда не будет необходимости в рутине, чтобы уничтожить план. Таким образом, дизайн API показывает, что он разработан с учетом того, что будет использоваться динамическое распределение памяти.
Ну зачем рисковать? fftw_plan - непрозрачный тип указателя. Таким образом, вы можете написать
fftw_plan myPlan = NULL;
// some code which may create a plan
if (myPlan)
fftw_destroy_plan(myPlan);