簡體   English   中英

定義無刪除指針的最干凈方法是什么?

[英]What is the cleanest way of defining a no-delete pointer?

我最近遇到了一個舊的C函數,該函數返回一個指向靜態數組的指針。 我圍繞該函數編寫了一個包裝器,並返回了一個std::unique_ptr ,它使用不刪除來強調返回的指針的類型-向用戶發出“請勿刪除我”警告。 這是示例代碼

 extern "C" int *f(int i);

 struct noop
 {
      template <typename T>
      void operator() (T t) const noexcept
      {
      }
 };
 class MyClass
 {
     public:          
     std::unique_ptr<int, noop> F(int value) const 
      { 
            return std::unique_ptr<int, noop>(f(value));
      }
 };

有沒有定義不刪除結構的更干凈的方法?

[..]舊的C函數返回指向靜態數組的指針。 我圍繞該函數編寫了一個包裝器,並返回了std::unique_ptr

別這樣 返回std::unique_ptr對調用者說:

  • 你擁有這個記憶,自己清理
  • 您擁有此內存,沒有其他人會干涉(線程安全)
  • 您擁有此記憶。 這樣,每次調用時都會得到一個新對象(包裝函數)。

對於靜態數組的指針,這都不是真的!

堅持使用原始指針或使用一些包裝器類以允許類似引用的訪問。 std::reference_wrapper還提供例如復制時的原始指針之類的語義。

C ++編碼准則建議使用別名或“虛擬”包裝器來表示所有權或非空性:

對於其實現,請查看:

https://github.com/Microsoft/GSL/blob/master/include/gsl/pointers

您將看到owner<>non_null<>的示例。

您可以類似定義。 顯然,不能刪除非所有指針。 如果您只想提醒一下,那么

template <class T, class = std::enable_if_t<std::is_pointer<T>::value>>
using non_owner = T;

如果要強制執行,請從鏈接中復制並修改non_null<>的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM