将 unique_ptr 和自定义删除器与 fftw3 库一起使用

问题描述 投票:0回答:1

使用 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))

我可以看到第二个参数的类型不匹配,但取消引用似乎并不能解决问题(而且我不明白为什么会这样)。

如果有人对如何进步有一些见解,我将不胜感激!

谢谢!

c++ smart-pointers unique-ptr fftw
1个回答
0
投票

如果我正确理解文档,那么

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(/*...*/));
© www.soinside.com 2019 - 2024. All rights reserved.