如果要宣布一个计划,那么立即销毁它,是否有分割错误的风险?
fftw_plan myPlan;
fftw_destroy_plan(myPlan);
我的直觉可能是,但我不知道fftw是否对这些事情做了任何内部记账,以避免释放未分配的记忆。
答案 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设计向我们展示了它的设计期望将使用动态内存分配。