Использование умных указателей с FFTW3 - PullRequest
0 голосов
/ 04 декабря 2018

В документации fftw3 стандартный пример:

#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 голосов
/ 04 декабря 2018

Я бы посоветовал с осторожностью использовать общие указатели в этом контексте.Да, вы можете дать необработанный указатель на функцию планирования FFTW (подробности ниже).Однако это не увеличит счетчик ссылок до общего указателя.Это проблематично, потому что план FFTW будет знать о памяти, , но общий указатель думает, что память никому не нужна, так что удалитель может быть вызван.Вы получите segfault.

Общие указатели не имеют неявного преобразования в необработанный указатель, вам нужно использовать метод .get ().Т.е.

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

Но не делай этого

...