如何在FFTW3库中结合unique_ptr与自定义删除器使用?
解决FFTW3中使用
unique_ptr管理fftw_plan的编译错误 问题根源
你错误地将fftw_plan(本身是指针类型,FFTW头文件中定义为typedef struct fftw_plan_s* fftw_plan;)作为unique_ptr的第一个模板参数,导致unique_ptr期望接收一个fftw_plan*(即指针的指针)作为构造函数第一个参数,但你传递的是fftw_plan类型的对象,类型完全不匹配,这就是编译报错的核心原因。
解决方法
方法1:利用指针类型推导定义智能指针
通过std::remove_pointer_t获取fftw_plan指向的不透明结构体类型,配合函数指针作为删除器:
#include <fftw3.h> #include <memory> #include <type_traits> // 定义可复用的智能指针类型别名 using FFTWPlanPtr = std::unique_ptr<std::remove_pointer_t<fftw_plan>, decltype(&fftw_destroy_plan)>; int main() { // 假设m、f、fk已完成初始化 FFTWPlanPtr myPlan( fftw_plan_dft_r2c(3, m, f, reinterpret_cast<fftw_complex*>(fk.get()), FFTW_PATIENT), fftw_destroy_plan ); // 执行FFT,需通过get()获取原始plan指针 fftw_execute(myPlan.get()); }
方法2:使用Lambda作为删除器(简洁直观)
Lambda可以避免复杂的类型推导,同时增强代码灵活性:
#include <fftw3.h> #include <memory> int main() { // 假设m、f、fk已完成初始化 auto myPlan = std::unique_ptr<void, void(*)(fftw_plan)>( fftw_plan_dft_r2c(3, m, f, reinterpret_cast<fftw_complex*>(fk.get()), FFTW_PATIENT), [](fftw_plan p) { fftw_destroy_plan(p); } ); // 执行FFT时需将void*转换回fftw_plan fftw_execute(static_cast<fftw_plan>(myPlan.get())); }
方法3:自定义删除器结构体(适合多次复用)
定义专用的删除器结构体,提升代码可读性和鲁棒性:
#include <fftw3.h> #include <memory> struct FFTWPlanDeleter { void operator()(fftw_plan p) const { if (p != nullptr) { fftw_destroy_plan(p); } } }; // 定义智能指针类型别名 using FFTWPlanPtr = std::unique_ptr<std::remove_pointer_t<fftw_plan>, FFTWPlanDeleter>; int main() { // 假设m、f、fk已完成初始化 FFTWPlanPtr myPlan( fftw_plan_dft_r2c(3, m, f, reinterpret_cast<fftw_complex*>(fk.get()), FFTW_PATIENT) ); // 执行FFT fftw_execute(myPlan.get()); }
注意事项
- 调用
fftw_execute时,必须通过get()方法获取unique_ptr管理的原始fftw_plan指针。 - 可以在删除器中添加空指针检查,避免对无效指针调用
fftw_destroy_plan。
内容的提问来源于stack exchange,提问作者Climbatized
相关产品推荐
相关产品推荐

