【发布时间】:2014-11-09 06:38:46
【问题描述】:
我正在使用 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);
浏览网页后,我注意到不建议将 unique_ptr 作为指针参数传递给函数。但是,我正在使用的库函数在其参数中需要一个指针。由于库函数需要更新指针,因此在将指针发送到函数之前我无法释放指针。 有没有有效的方法来处理这个问题?
【问题讨论】:
-
显然,这样做有点不舒服,因为您明确回避了使 unique_ptr 安全的所有机制;但在一个类似的问题here 中,共识似乎是,当处理一个期望原始指针(Fortran、C 或其他)的 API 时,使用 .get() 是可以的,而例程不会执行使用指针进行任何内存管理(BLAS 肯定不会)。请注意,DAXPY 不会更新 指针;它会更新指向的数据。
-
@JonathanDursi 我不认为这是一件不舒服的事情。我认为这是一件非常自然的事情。调用代码拥有数组的唯一所有权,您知道在调用库期间它将保持活动状态。我认为这是调用函数的正确方法,即使它们在您自己的代码中。这是假设函数没有尝试获取数组的所有权并稍后对其调用 delete 在这种情况下使用 unique_ptr 是一个坏主意。
标签: c++ c++11 fortran argument-passing unique-ptr