2013-10-06 68 views
0

如果有人要宣佈這樣的計劃,然後立即銷燬它,是否存在分段錯誤的風險?銷燬未初始化的FFTW計劃是否安全?

fftw_plan myPlan; 
fftw_destroy_plan(myPlan); 

我的直覺是可能的,但我不知道是否確實FFTW在這些事情上的任何內部簿記避免釋放未分配的內存。

回答

2

是的,存在風險。這似乎是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設計向我們展示了它的設計,期望動態內存分配將被使用。

2

那麼爲什麼要抓住機會呢? fftw_plan是不透明指針類型。所以你可以寫

fftw_plan myPlan = NULL; 

// some code which may create a plan 

if (myPlan) 
    fftw_destroy_plan(myPlan); 
相關問題