[英]Pass by reference vs. Pass by shared_ptr
關於Stackoverflow的大多數問題都在詢問shared_ptr應該通過ref還是按值傳遞。 但是我的問題是這樣的例子:
class Foo;
void function1(Foo & ff) { ff.m_abc = 1024; }
void function2(const std::shared_ptr<Foo> & ff) { ff->m_abc = 1024; }
function1
和function2
可以使用和更改ff的某些部分。
我的情況在這里:
我需要使用arg *this
或shared_from_this()
調用函數。
print(msg, *this);
or
print(msg, this->shared_from_this());
我可以在function1
代碼中使用function1
或function2
樣式。
但是,如果我使用function2
樣式,則需要實現Foo
以從std::enable_shared_from_this
繼承,但是使用function1
樣式,則不需要這樣做。
我在單線程環境中使用此功能
僅當該函數關心是否有shared_ptr
時才將shared_ptr
傳遞給該函數,通常是因為它想保留一個副本,或者是weak_ptr
。
任何其他事情只會降低該功能的適用性,而不會帶來任何收益。
如果要與正在調用的函數共享對象的所有權,則應該傳遞shared_ptr
,也就是說,如果要確保對象在函數需要的情況下仍然有效,則應傳遞該對象的所有權。
一種重要的情況是,如果您的函數執行異步操作,則該操作可能要在操作完成后再使用您的對象,屆時您的對象可能已被刪除,因此如果通過引用傳遞,則該引用會懸空,而如果您傳遞了shared_from_this()
,則可以確保將對象的生存期延長到該函數需要的時間。 (例如, boost::asio
大多數代碼示例均基於此邏輯)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.