Я использую библиотеку LAPACK для создания R-пакета с использованием C++. Я использую unique_ptr для определения массивов, какПередача unique_ptr в библиотечные функции (функция FORTRAN)
unique_ptr<double[]> my_arr(new double[arr_length]);
тогда я прохожу этот unique_ptr к библиотеке функции (FORTRAN функции), которая принимает указатель на двойной массив и буду обновлять этот массив внутри функции, как
F77_CALL(daxpy) (&num_feat_, &beta, tmp, &inc_one, my_arr.get(), &inc_one);
Пройдя через сеть, я заметил, что не рекомендуется передавать unique_ptr в качестве аргумента указателя функции. Однако функции библиотеки, которые я использую, нуждаются в указателе в их аргументе. Я не могу освободить указатель перед отправкой его функции, так как библиотечная функция должна обновить указатель. Есть ли эффективный способ справиться с этим?
Очевидно, что это немного неудобно, поскольку вы явно обошли все механизмы, которые делают safe_ptr безопасным; но в аналогичном вопросе [здесь] (http://stackoverflow.com/questions/9908535/unique-ptr-with-an-api-that-expects-raw-pointers) консенсус, казалось, заключался в том, что при работе с API, который ожидает, что raw указатели (Fortran, C или что-то еще), которые используют .get(), в порядке, когда подпрограммы не будут выполнять управление памятью с помощью указателя (что BLAS, конечно же, не будет). Обратите внимание, что DAXPY не будет обновлять _pointer_; он обновляет данные, на которые указывает. –
@ JonathanDursi Я не думаю, что это неудобно. Я думаю, что это совершенно естественно. Вызывающий код имеет уникальное право собственности на массив, и вы * знаете *, он будет жив в течение всего времени вызова библиотеки. Я думаю, что это правильный способ вызова функций, даже если они находятся в вашем собственном коде. Это предполагает, что функция не пытается взять на себя ответственность за массив и называть delete на нем позже, и в этом случае использование unique_ptr - плохая идея. –