将智能指针与FFTW3结合使用

时间:2018-12-04 13:50:51

标签: smart-pointers fftw

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库一起使用?

1 个答案:

答案 0 :(得分:1)

在这种情况下,我建议谨慎使用共享指针。是的,您可以给FFTW规划功能一个原始指针(详细信息如下)。但是,这不会将引用计数器增加到共享指针。这是有问题的,因为FFTW计划会知道内存,但但是共享指针认为它没有人需要内存,因此可以调用删除程序。您会遇到段错误。

共享指针没有对原始指针的隐式转换,您想使用'.get()'方法。即

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

但是不要这样做