enable from this方法的使用與陷阱

2021-07-23 16:24:13 字數 1892 閱讀 2253

enable_from_this 的使用與實現原理說明:

shared_from_this()是enable_shared_from_this的成員函式,返回shared_ptr;

注意的是,這個函式僅在shared_ptr的建構函式被呼叫之後才能使用。

原因是enable_shared_from_this::weak_ptr並不在建構函式中設定,而是在shared_ptr的建構函式中設定。

使用場合:當前類a的例項物件正被share_ptr管理,且在類a的成員函式裡需要把當前類物件作為引數傳給其他函式時,就需要傳遞乙個指向此類a的例項物件自身的share_ptr。

錯誤的使用**一:

#include

#include

#include

using namespace std

;class d:

public boost:

:enable_shared_from_this

};int main(

)

程式編譯通過,執行結果如下:

d::d()

terminate called after throwing an instance of 'boost::exception_detail::clone_impl >'

what():  tr1::bad_weak_ptr

aborted

說明在d的建構函式中呼叫shared_from_this(), 此時d的例項本身尚未構造成功,weak_ptr也就尚未設定,所以程式丟擲tr1::bad_weak_ptr異常。

錯誤的使用**二:

#include

#include

#include

using namespace std

;class d:

public boost:

:enable_shared_from_this

void func(

)    

};int main(

)

程式編譯通過,執行結果如下:

d::d()

d::func()

terminate called after throwing an instance of 'boost::exception_detail::clone_impl >'

what():  tr1::bad_weak_ptr

aborted

失敗原因分析:

在主函式main中,d的例項是在棧上構造,沒有使用boost::shared_ptr 的構造方式,

所以boost::enable_shared_from_this中的weak_ptr所指的函式物件也就沒有被賦值,

在呼叫d.func()中使用shared_from_this()函式時

----注:shared_from_this的函式實現 ------

shared_ptr shared_from_this()

----注:shared_from_this的函式實現 ------

呼叫boost_assert( p.get() == this );  失敗,丟擲以上異常。

最後,我們給出share_from_this()的正確使用例子:

#include

#include

#include

using namespace std

;class d:

public boost:

:enable_shared_from_this

void func(

)    

};int main(

)

執行結果:

d::d()

d::func()

enable from this方法的使用與陷阱

enable from this 的使用與實現原理說明 shared from this 是enable shared from this的成員函式,返回shared ptr 注意的是,這個函式僅在shared ptr的建構函式被呼叫之後才能使用。原因是enable shared from this...

關於springCloud中服務方呼叫方的配置

1.我方是服務方,別人呼叫我方,由我方提供位址,不需要呼叫feign。那麼,位址資訊在resourceconfig裡面做配置,resourceconfig中配置的位址相當於是把請求位址暴露給對方,並在此位址請求時對他放行。configuration enableresourceserver publ...

Container DataItem幾種方式

在繫結資料時經常會用到這個句程式 databinder.eval container.dataitem,x 或者 databinder.eval container,dataitem.x 今天又學到一種,而且微軟也說這種方法的效率要比以上兩種高。datarowview container.datai...