Безопасно ли уничтожать неинициализированный план FFTW?

0

Если кто-то должен был объявить план как таковой, то немедленно уничтожить его, существует ли риск возникновения сегментации?

fftw_plan myPlan;
fftw_destroy_plan(myPlan);

Может быть, мое чувство кишки, но я не знаю, делает ли fftw какую-либо внутреннюю бухгалтерскую отчетность на этих вещах, чтобы избежать освобождения нераспределенной памяти.

Теги:
fftw

2 ответа

2
Лучший ответ

Да, есть риск. Это, по-видимому, определение 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 показывает, что он разработан с учетом того, что будет использоваться динамическое распределение памяти.

2

Ну зачем рисковать? fftw_plan - непрозрачный тип указателя. Таким образом, вы можете написать

fftw_plan myPlan = NULL;

// some code which may create a plan

if (myPlan)
    fftw_destroy_plan(myPlan);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню