[英]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函数),该函数接受指向double数组的指针,并将函数内的此数组更新为
F77_CALL(daxpy) (&num_feat_, &beta, tmp, &inc_one, my_arr.get(), &inc_one);
浏览完网页后,我注意到不建议将unique_ptr作为指针参数传递给函数。 但是,我正在使用的库函数需要在其参数中使用指针。 由于库函数需要更新指针,因此在将指针发送到函数之前无法释放指针。 有没有有效的方法来处理这个?
假设该库不会取得数组的所有权并尝试delete
它本身,我认为这是完全正常的。
您通常应该更喜欢通过引用或原始指针传递,并且通常只在传输所有权时传递unique_ptr
,所以我认为这是正确的。 调用代码保留了数组的唯一所有权。
您知道在函数调用之后,当unique_ptr
超出范围时,数组将不会被删除,这正是您想要的。
我认为这是调用不会占用所有权的函数的正确方法,即使它们在您自己的代码中也是如此。
有关如何传递(智能)指针的摘要,请参阅GotW#91 。
如果库在函数调用之后保留了指针,则必须确保unique_ptr
在库完成使用之前不会超出范围,这有点棘手。
有些库假设您将在堆上分配对象并通过原始指针赋予它们所有权(我在一些可视化库中看到过它)。 他们完成后delete
对象。 这在C ++ 11中通常被认为是不好的做法,但是如果你需要调用这样的库,你不应该使用unique_ptr
因为你不想自己delete
对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.