2013-03-05 25 views
0

我在pagePtr.h使用boost :: scoped_ptr的如果可能的話

typedef int (*FunPtrType)(char* sz, unsigned int max_bytes, char* arg1, 
char* arg2, char* arg3, char* arg4); 

並創建一個對象

static pagePtr* CreatePage(FunPtrType Ptr2Fun) 
{ 
    return new pagePtr(ptr2Fun); 
} 

將提振::靜態函數是這樣的scoped_ptr的幫助我不用擔心刪除那些稍後創建的。如果是的話,我應該如何執行這種情況。 還有什麼可能的更好的選擇,如果可用,刪除這些創建的對象。

+3

你需要'的std :: unique_ptr'。 'boost :: scoped_ptr'不能傳遞。 – 2013-03-05 13:38:53

+0

你可以使用std :: unique_ptr或std :: shared_ptr:std :: unique_ptr CreatePage(...)... – AnatolyS 2013-03-05 13:42:07

+0

你能幫助我看看在我的情況下使用std :: unique_ptr的實現方式嗎? – cybercop 2013-03-05 13:47:02

回答

3

對於具有動態分配一個對象,並安全地返回所有權給調用者是返回一個函數的成語一個std::unique_ptr

std::unique_ptr<foo> create_foo() 
{ 
    return std::unique_ptr<foo>(new foo()); 
} 

這告訴來電者明確表示,他們所得到的對象和所有權物品在銷燬時會被銷燬(除非所有權在別處進一步傳遞)。

適用於你的例子:

static std::unique_ptr<pagePtr> CreatePage(FunPtrType ptr2Fun) 
{ 
    return std::unique_ptr<pagePtr>(new pagePtr(ptr2Fun)); 
} 

至於爲什麼其他指針不適用:

  • boost::scoped_ptr無法通過所有權的全部 - 這是最嚴格的智能指針(幾乎相當於const std::unique_ptr
  • std::auto_ptr已棄用,因爲它通過複製提供移動語義
  • std::shared_ptr會工作,但並沒有太大的意義 - 當然,該功能不會與呼叫者共享所有權,因爲函數結束
5

boost:scoped_ptr是不可拷貝所以不能從CreatePage()返回。如果C++ 11可std::unique_ptr可用於:

static std::unique_ptr<pagePtr> CreatePage(FunPtrType Ptr2Fun) 
{ 
    return std::unique_ptr<pagePtr>(new pagePtr(ptr2Fun)); 
} 

是否有一個原因是pagePtr不可拷貝?如果不是,並且複製便宜,然後按值返回。

如果pagePtr是不可複製和std::unique_ptr不可用,那麼你可以使用boost::shared_ptr從主叫取出責任心的破壞返回pagePtr。缺點是使用shared_ptr並不表示只有所有權,併爲不需要的引用計數支付價格(有關可用智能指針的更多信息和說明,請參閱What C++ Smart Pointer Implementations are available?)。

從發佈代碼,pagePtr似乎周圍的函數指針的包裝所以請考慮使用替代boost::function,這是可複製,並徹底清除pagePtr

typedef boost::function<int(char* sz, 
          unsigned int max_bytes, 
          char* arg1, 
          char* arg2, 
          char* arg3, 
          char* arg4)> FunPtrType; 
+0

實際上,'std :: unique_ptr'沒有拷貝構造函數;這是所謂的移動構造函數。 – refi64 2014-05-15 01:23:51

相關問題