使用 fftw3 快速傅里叶变换 (FFT) 库时,会声明并初始化一个计划变量,然后用它来执行一些 FFT,并在释放内存时销毁它:
#include <fftw3.h>
// Declare plan
fftw_plan myPlan;
// Initialise plan
myPlan = fftw_plan_dft_r2c(3, m, f, reinterpret_cast<fftw_complex*>(fk.get()), FFTW_PATIENT);
// Perform an FFT
fftw_execute(myPlan);
// Free the memory associated with the plan
fftw_destroy_plan(myPlan);
在上面:m、f 和 fk.get() 是指向数组的原始指针,代码运行得很好。
但是,我一直在尝试使用智能指针来设置此过程,当计划超出范围时,该指针将自动释放内存。这就是我想到的:
std::unique_ptr<fftw_plan, decltype(&fftw_destroy_plan)> myPlan(
fftw_plan_dft_r2c(3, m, f, reinterpret_cast<fftw_complex*>(fk.get()), FFTW_PATIENT),
fftw_destroy_plan
);
不幸的是,我收到以下编译器错误:
no instance of constructor "std::unique_ptr<_Tp, _Dp>::unique_ptr [with _Tp=fftw_plan, _Dp=void (*)(fftw_plan p)]" matches the argument listC/C++(289)
strFunc.cc(26, 9): argument types are: (fftw_plan, void (fftw_plan p))
我可以看到第二个参数的类型不匹配,但取消引用似乎并不能解决问题(而且我不明白为什么会这样)。
如果有人对如何进步有一些见解,我将不胜感激!
谢谢!
如果我正确理解文档,那么
fftw_plan
是一个不透明的指针类型。
在这种情况下你可以这样做:
struct deleter {
using pointer = fftw_plan;
void operator()(pointer plan) const { fftw_destroy_plan(plan); }
};
std::unique_ptr<void, deleter> myPlan(fftw_plan_dft_r2c(/*...*/));