如果要这样声明一个计划,然后立即销毁它,是否存在分段错误的风险?
fftw_plan myPlan;
fftw_destroy_plan(myPlan);
我的直觉可能是,但我不知道 fftw 是否对这些事情进行任何内部簿记以避免释放未分配的内存。
那么为什么要冒险呢?fftw_plan 是一个不透明的指针类型。所以你可以写
fftw_plan myPlan = NULL;
// some code which may create a plan
if (myPlan)
fftw_destroy_plan(myPlan);
是的,有风险。这似乎是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 的理论替代实现而不是实际代码。
从理论上讲,FFTW API 可能会在计划中使用固定数量的空间(fftw_plan
大struct
而不是指针)来实现,因此动态内存分配不是必需的,free
也不会使用。但是,这样就不需要例行程序来破坏计划了。因此 API 设计向我们展示了它的设计预期将使用动态内存分配。