簡體   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