如果有人要宣佈這樣的計劃,然後立即銷燬它,是否存在分段錯誤的風險?銷燬未初始化的FFTW計劃是否安全?
fftw_plan myPlan;
fftw_destroy_plan(myPlan);
我的直覺是可能的,但我不知道是否確實FFTW在這些事情上的任何內部簿記避免釋放未分配的內存。
如果有人要宣佈這樣的計劃,然後立即銷燬它,是否存在分段錯誤的風險?銷燬未初始化的FFTW計劃是否安全?
fftw_plan myPlan;
fftw_destroy_plan(myPlan);
我的直覺是可能的,但我不知道是否確實FFTW在這些事情上的任何內部簿記避免釋放未分配的內存。
是的,存在風險。這似乎是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
將試圖銷燬它。即使我們考慮FFT的理論替代實現,而不是實際的代碼,這幾乎肯定涉及計劃中的指針free
。
這在理論上是可能的FFTW API可能與的空間在平面固定的量來實現(具有fftw_plan
是一個大struct
而不是指針),以便動態存儲器分配是沒有必要的,並且不使用free
。但是,那麼就不需要例行公事來摧毀一個計劃。所以API設計向我們展示了它的設計,期望動態內存分配將被使用。
那麼爲什麼要抓住機會呢? fftw_plan是不透明指針類型。所以你可以寫
fftw_plan myPlan = NULL;
// some code which may create a plan
if (myPlan)
fftw_destroy_plan(myPlan);