簡體   English   中英

如果可能的話使用boost :: scoped_ptr

[英]using boost::scoped_ptr if possible

我在pagePtr.h中有這樣的內容

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的幫助,我不必擔心以后刪除那些創建的對象。 如果是,在這種情況下應如何實施。 如果有的話,還有其他可能更好的選擇來刪除那些創建的對象。

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並不表示擁有唯一所有權,也不用為不需要的引用計數付出代價(有關可用智能指針的更多信息和說明,請參閱可用的C ++智能指針實現? )。

從發布的代碼中, pagePtr出現在函數指針周圍的包裝器中,因此請考慮使用可復制的boost::function ,然后完全刪除pagePtr

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

具有可以動態分配對象並安全地將所有權返回給調用方的函數的慣用法是返回std::unique_ptr

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

這明確地告訴調用方他們正在獲得對象的所有權,並且銷毀其std::unique_ptr時將銷毀該對象(除非所有權進一步傳遞給其他地方)。

應用於您的示例:

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可以工作,但意義不大-該函數肯定不會與調用方共享所有權,因為該函數即將結束

暫無
暫無

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

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