[英]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.