You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:53:19