在 FFTW3 中使用智能指针

Using Smart Pointers With FFTW3

fftw3 documentation中,标准示例是:

#include <fftw3.h>
...
{
    fftw_complex *in, *out;
    fftw_plan p;
    ...
    in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
    out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
    p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
    ...
    fftw_execute(p); /* repeat as needed */
    ...
    fftw_destroy_plan(p);
    fftw_free(in); fftw_free(out);
}

以下语法也适用:

#include <fftw3.h>
{
  fftw_complex *in, *out;
  fftw_plan p;
  ...
  in = new fftw_complex[N];
  out = new fftw_complex[N];
  p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
  ...
  fftw_execute(p); /* repeat as needed */
  ...
  fftw_destroy_plan(p);
  delete [] in;
  delete [] out;
}

我想改用智能指针,也许是这样的:

#include <fftw3.h>
...
{
    fftw_plan p;
    ...
    auto *in = std::make_shared<fftw_complex[N]>();
    auto *out = std::make_shared<fftw_complex[N]>();
    p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
    ...
    fftw_execute(p); /* repeat as needed */
    ...
}

但我似乎无法弄清楚语法。有没有人将智能指针与 FFTW3 库一起使用?

我建议在此上下文中谨慎使用共享指针。是的,您可以提供指向 FFTW 规划功能的原始指针(详情如下)。但是,这不会增加共享指针的引用计数器。这是有问题的,因为 FFTW 计划会知道内存, 共享指针认为没有人需要内存,因此可以调用删除器。你会遇到段错误。

共享指针没有到原始指针的隐式转换,您需要使用“.get()”方法。 IE。

p = fftw_plan_dft_1d(N, in.get(), out.get(), FFTW_FORWARD, FFTW_ESTIMATE);

但不要这样做