簡體   English   中英

通過引用傳遞vs.shared_ptr傳遞

[英]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; }

function1function2可以使用和更改ff的某些部分。


我的情況在這里:

我需要使用arg *thisshared_from_this()調用函數。

print(msg, *this);

or

print(msg, this->shared_from_this());

我可以在function1代碼中使用function1function2樣式。

但是,如果我使用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.

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