繁体   English   中英

将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函数),该函数接受指向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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM