将unique_ptr传递给库函数(FORTRAN函数)
Passing unique_ptr to library functions (FORTRAN function)
我正在使用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
对象。
相关文章:
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 有没有一个 c++ gmp 库函数与 python gmpy2 库 divm(..) 函数相同?
- 好友库函数可以访问子数据
- 覆盖程序中的标准 C 库函数C++
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- 在不使用内置库函数的情况下添加字符串,我做错了什么?
- 返回time()库函数的数据类型
- 将C++中的多个参数传递给MatLab共享库函数
- 从另一个动态链接库项目调用静态库函数
- 导入的库函数是否可以在内存中移动
- 带参数的线程调用库函数
- 在 MASM 中调用标准库函数
- char concat c++ 没有库函数
- 为什么C++ std::min_element 库函数接受采用布尔返回类型的函数对象的函子,而不是像 C 中那样的 in
- 如何在将指针传递给库函数时处理内存管理
- 使库函数模板化以避免编译器指令是否有益?
- 结构被库函数覆盖
- 如何在标准库C/C++函数中进行gdb单步执行操作
- 如何从 c++ 调用动态库函数
- 将unique_ptr传递给库函数(FORTRAN函数)