我正在使用LAPACK库使用C ++创建R-package。我使用unique_ptr将数组定义为
unique_ptr<double[]> my_arr(new double[arr_length]);
然后我将此unique_ptr传递给库函数(FORTRAN函数),该函数接受指向double数组的指针,并将函数内的此数组更新为
F77_CALL(daxpy) (&num_feat_, &beta, tmp, &inc_one, my_arr.get(), &inc_one);
通过网络后,我注意到不建议将unique_ptr作为指针参数传递给函数。但是,我正在使用的库函数需要在其参数中使用指针。由于库函数需要更新指针,因此在将指针发送到函数之前无法释放指针。 有没有有效的方法来处理这个?
答案 0 :(得分:0)
假设图书馆不会取得数组的所有权并尝试delete
本身,我觉得这很好。
您通常更喜欢通过引用或原始指针传递,并且通常只在您转移所有权时通过unique_ptr
,所以我认为这是正确的。调用代码保留了数组的唯一所有权。
您知道在unique_ptr
超出范围之后,直到函数调用之后才会删除数组,这正是您想要的。
我认为这是调用不会占用所有权的函数的正确方法,即使它们在您自己的代码中也是如此。
有关如何传递(智能)指针的摘要,请参阅GotW #91。
如果库在函数调用后保留了指针,则必须确保unique_ptr
在库完成使用之前没有超出范围,这有点棘手。
有些库假设您将在堆上分配对象并通过原始指针赋予它们所有权(我在一些可视化库中看到过它)。他们完成后delete
对象。这在C ++ 11中通常被认为是不好的做法,但是如果你需要调用这些库,你不应该使用unique_ptr
,因为你不想自己delete
这个对象。