将unique_ptr传递给库函数(FORTRAN函数)

Passing unique_ptr to library functions (FORTRAN function)

本文关键字:库函数 FORTRAN 函数 unique ptr      更新时间:2023-10-16

我正在使用LAPACK库使用C++创建一个R包。我使用unique_ptr将阵列定义为

   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);

在浏览完web之后,我注意到不建议将unique_ptr作为指针参数传递给函数。但是,我正在使用的库函数在其参数中需要一个指针。在将指针发送到函数之前,我无法释放指针,因为库函数需要更新指针。有什么有效的方法来处理这个问题吗?

假设库不会获得数组的所有权并尝试delete它本身,我认为这是完全可以的。

您通常应该更喜欢通过引用或原始指针传递,并且通常只在转移所有权时传递unique_ptr,所以我认为这是正确的。调用代码保留数组的唯一所有权。

您知道,在函数调用之后,当unique_ptr超出您想要的范围时,数组才会被删除。

我认为这是调用那些即使在您自己的代码中也不会获得所有权的函数的正确方法。

有关如何传递(智能)指针的摘要,请参阅GotW#91。

如果库在函数调用后保留了指针,则必须确保unique_ptr在库完成使用之前不会超出范围,这就有点棘手了。

有些库假设您将在堆上分配对象,并通过原始指针赋予它们所有权(我在一些可视化库中看到过)。它们在完成时delete对象。这在C++11中通常被认为是不好的做法,但如果您需要调用这样的库,则不应该使用unique_ptr,因为您不想自己delete对象。