破坏未初始化的FFTW计划是否安全?

时间:2013-10-06 06:14:46

标签: c++ c fftw

如果要宣布一个计划,那么立即销毁它,是否有分割错误的风险?

fftw_plan myPlan;
fftw_destroy_plan(myPlan);

我的直觉可能是,但我不知道fftw是否对这些事情做了任何内部记账,以避免释放未分配的记忆。

2 个答案:

答案 0 :(得分:2)

那为什么要抓住机会? fftw_plan是不透明指针类型。所以你可以写

fftw_plan myPlan = NULL;

// some code which may create a plan

if (myPlan)
    fftw_destroy_plan(myPlan);

答案 1 :(得分:2)

是的,存在风险。这似乎是FFTW 3.3.3中fftw_destroy_plan的定义:

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的理论替代实现而不是实际代码。

理论上,FFTW API可能在计划中使用固定数量的空间来实现(fftw_plan是一个大的struct而不是一个指针),因此动态内存分配不是必要,并且未使用free。但是,那么就不需要例行程序来销毁计划。因此API设计向我们展示了它的设计期望将使用动态内存分配。