0

如果要这样声明一个计划,然后立即销毁它,是否存在分段错误的风险?

fftw_plan myPlan;
fftw_destroy_plan(myPlan);

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

4

2 回答 2

2

那么为什么要冒险呢?fftw_plan 是一个不透明的指针类型。所以你可以写

fftw_plan myPlan = NULL;

// some code which may create a plan

if (myPlan)
    fftw_destroy_plan(myPlan);
于 2013-10-06T07:06:23.137 回答
2

是的,有风险。这似乎是fftw_destroy_planFFTW 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 的理论替代实现而不是实际代码。

从理论上讲,FFTW API 可能会在计划中使用固定数量的空间(fftw_planstruct而不是指针)来实现,因此动态内存分配不是必需的,free也不会使用。但是,这样就不需要例行程序来破坏计划了。因此 API 设计向我们展示了它的设计预期将使用动态内存分配。

于 2013-10-06T09:32:43.040 回答