青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Error

C++博客 首頁 新隨筆 聯系 聚合 管理
  217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks
// boost_singal_solt.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <boost/signals2.hpp>
class CTarget /*: public boost::signals2::trackable*/
{
public:
    virtual ~CTarget()
    {
        std::cout << __FUNCTION__ << std::endl;
    }
    CTarget()
    {
        m_strMsg = "1343rwkjdfkjdfasdklf";
    }
    void SomeHandle()
    {
        std::cout << __FUNCTION__ << std::endl;
        std::cout << m_strMsg << std::endl;
    }
    void SomeHandle1()
    {
        std::cout << __FUNCTION__ << std::endl;
    }
private:
    std::string m_strMsg;
};
class CSource
{
public:
    boost::signals2::connection Connect(const boost::signals2::signal<void(void)>::slot_type &sub)
    {
        return m_sig.connect(sub);
    }
    void OnSig()
    {
        m_sig();
    }
private:
    boost::signals2::signal<void(void)> m_sig;
};
int _tmain(int argc, _TCHAR* argv[])
{
    CSource source;
    boost::signals2::connection conn;
    {
        CTarget target;
        
        /*conn = */source.Connect(boost::bind(&CTarget::SomeHandle, &target));
        source.Connect(boost::bind(&CTarget::SomeHandle1, &target));
        source.OnSig();
    }
    source.OnSig();
return 0;
}


在繼承boost::signals2::trackable的情況下,Target析構以后不會調用,但是不繼承是會調用的。也就是說,這是一個危險操作,不知道內部怎么管理的,會不會出現內存泄漏?
/////////////////////////////////////////////////////////////////////////////


// boost_singal_solt.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <boost/signals2.hpp>
class CSource
{
public:
    boost::signals2::connection Connect(const boost::signals2::signal<void(void)>::slot_type &sub)
    {
        return m_sig.connect(sub);
    }
    void OnSig()
    {
        m_sig();
    }
private:
    boost::signals2::signal<void(void)> m_sig;
};
class CTarget : public boost::signals2::trackable
{
public:
    virtual ~CTarget()
    {
        std::cout << __FUNCTION__ << std::endl;
        m_con.disconnect();
    }
    CTarget()
    {
        m_strMsg = "1343rwkjdfkjdfasdklf";
    }
    void RegisterSolts(CSource& source)
    {
        m_con = source.Connect(boost::bind(&CTarget::SomeHandle, this));
    }
    void SomeHandle()
    {
        std::cout << __FUNCTION__ << std::endl;
        std::cout << m_strMsg << std::endl;
    }
    void SomeHandle1()
    {
        std::cout << __FUNCTION__ << std::endl;
    }
private:
    std::string m_strMsg;
    boost::signals2::connection m_con;
};
int _tmain(int argc, _TCHAR* argv[])
{
    CSource source;
    boost::signals2::connection conn;
    {
        CTarget target;
        
        target.RegisterSolts(source);
        //source.OnSig();
    }
    source.OnSig();
return 0;
}
確認只要維護好connection在對象target析構以后一定是disconnect應該就OK沒事,,,





///////////////////////////////////////////


整體上看來是這樣:
問題:target的成員函數和this指針打包注冊到source上以后,如果target析構,source無法感知到,可能會調用已經成為野指針的target地址。
解決:signals2庫的解決辦法是,用一個connection來維護打包的target成員函數和source上的signal的連接關系。target持有這個connection,當自身析構的時候必須調用disscontion解除這個關系。

如果要抄襲,也是要設計一種機制,在target析構的時候,想辦法清除它在別處注冊的函數指針。
1.可以建立target到source的關系,target析構以后通知source,souce清理自身保留的target相關打包函數。這種方式在使用boost bind的時候可能就有問題了,應為之依靠target指針去判斷bind出來的function有難度。
2.建立關系的時候就將解除關系的函數打包到一個新的對象中,然后由target負責在自己析構的時候去調用它。

!!!如果source先于target析構,就悲劇了。但是實際情況是,如果source已經析構了,也無法觸發target綁定的函數了。但問題是,target析構的時候還是去觸發source綁定到target的解除關系的函數。悲催。但是實際測試這個問題不存在,估計是用類似weak_ptr的技術。
在完全理解之前,務必保證source生命周期大于target
// boost_singal_solt.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <boost/signals2.hpp>
class CSource
{
public:
    boost::signals2::connection Connect(const boost::signals2::signal<void(void)>::slot_type &sub)
    {
        return m_sig.connect(sub);
    }
    void OnSig()
    {
        m_sig();
    }
private:
    boost::signals2::signal<void(void)> m_sig;
};
class CTarget : public boost::signals2::trackable
{
public:
    virtual ~CTarget()
    {
        //std::cout << __FUNCTION__ << std::endl;
        m_con.disconnect();
    }
    CTarget()
    {
        m_strMsg = "1343rwkjdfkjdfasdklf";
    }
    void RegisterSolts(CSource& source)
    {
        m_con = source.Connect(boost::bind(&CTarget::SomeHandle, this));
    }
    void SomeHandle()
    {
        std::cout << __FUNCTION__ << std::endl;
        std::cout << m_strMsg << std::endl;
    }
    void SomeHandle1()
    {
        std::cout << __FUNCTION__ << std::endl;
    }
private:
    std::string m_strMsg;
    boost::signals2::connection m_con;
};
int _tmain(int argc, _TCHAR* argv[])
{
    for (;;)
    {
        CSource* pSource = new CSource;
        boost::signals2::connection conn;
        CTarget* pTarget = new CTarget;
        pTarget->RegisterSolts(*pSource);
        delete pSource;
        delete pTarget;
    }
    //source.OnSig();
return 0;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

沒有完全讀明白之前,在需要7×24運行的環境還是慎重使用。不過客戶端貌似無所謂,,,囧。
posted on 2014-05-30 01:09 Enic 閱讀(811) 評論(0)  編輯 收藏 引用 所屬分類: boost
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美成va人片在线观看| 亚洲精选在线| 久久综合色婷婷| 久久久99爱| 午夜精品一区二区三区在线 | 亚洲欧美久久| 欧美国产日韩a欧美在线观看| 亚洲综合色丁香婷婷六月图片| 国产伦理一区| 欧美日韩国产区| 欧美精品亚洲一区二区在线播放| 国产精品夜夜夜| 亚洲激情二区| 久久九九精品| 夜夜精品视频一区二区| 亚洲午夜视频在线观看| 麻豆91精品| 国产一区二区精品久久91| 亚洲裸体视频| 亚洲欧美成人一区二区在线电影| 国产一区二区三区奇米久涩| 欧美激情中文字幕一区二区| 国产精品国内视频| 国产一区二区三区奇米久涩| 欧美www在线| 欧美在线看片| 国产欧美日韩视频| 欧美亚洲视频| 亚洲美女啪啪| 欧美激情aⅴ一区二区三区| 久久天堂精品| 欧美亚洲日本一区| 欧美日韩综合在线| 一本色道久久88综合亚洲精品ⅰ| 久久精品亚洲精品国产欧美kt∨| 亚洲精品三级| 欧美国产成人在线| 久久成人免费电影| 美女国产一区| 99日韩精品| 亚洲国产aⅴ天堂久久| 午夜精品视频在线| 亚洲一区激情| 国产日韩精品一区二区| 亚洲国产一区二区视频| 亚洲高清三级视频| 亚洲在线中文字幕| 99这里只有久久精品视频| 欧美中文字幕在线观看| 一区二区三区欧美亚洲| 日韩一区二区高清| 亚洲激情视频网站| 久久久久9999亚洲精品| 国产精品麻豆va在线播放| 激情久久五月| 欧美激情一区二区三区高清视频| 国产亚洲在线| 午夜在线精品| 欧美一区网站| 美女网站久久| 久热综合在线亚洲精品| 欧美美女日韩| 欧美一级午夜免费电影| 欧美色欧美亚洲另类七区| 亚洲国产日韩欧美| 亚洲国产精品第一区二区三区 | 久久久99精品免费观看不卡| 国产精品国产三级国产a| 亚洲精品欧美日韩专区| 日韩午夜黄色| 亚洲视频导航| 亚洲人成7777| 亚洲一区二区四区| 午夜视频久久久| 国产欧美精品在线播放| 先锋影音久久久| 久久久www成人免费精品| 好吊色欧美一区二区三区视频| 91久久久久久久久久久久久| 国产麻豆精品视频| 欧美亚洲视频| 农夫在线精品视频免费观看| 亚洲国产欧美不卡在线观看 | av成人福利| 午夜精品福利视频| 国产一区二区三区久久久| 久久久精品一品道一区| 欧美激情亚洲综合一区| 亚洲视频在线观看| 久久嫩草精品久久久精品| 亚洲欧美综合精品久久成人| 国产精品视频一区二区三区| 久久se精品一区二区| 欧美国产精品v| 国产亚洲精品一区二区| 六月丁香综合| 一本大道久久a久久综合婷婷 | 一本色道婷婷久久欧美| 国产精品免费看| 久久久www成人免费精品| 亚洲激情不卡| 久久精品国产99精品国产亚洲性色 | 亚洲婷婷在线| 牛人盗摄一区二区三区视频| 亚洲一本大道在线| 欧美精品自拍| 欧美制服丝袜第一页| 亚洲国产精品国自产拍av秋霞| 亚洲私人影吧| 亚洲成人在线视频播放| 欧美伊久线香蕉线新在线| 欧美国产三区| 久久爱另类一区二区小说| 亚洲激情成人网| 国产毛片一区二区| 欧美日韩国产一中文字不卡| 欧美在线资源| 亚洲视频在线一区| 91久久中文| 免费在线看成人av| 午夜精品av| 一本大道久久a久久精二百| 一区二区在线不卡| 国产精品免费在线| 欧美日韩精品免费观看视频| 久久综合九色欧美综合狠狠| 欧美一区二区观看视频| 99视频一区二区三区| 欧美激情国产高清| 久久综合一区二区| 欧美中文字幕在线| 亚洲欧美国产三级| 国产欧美视频一区二区| 欧美日韩一区三区| 亚洲一本视频| 一区电影在线观看| 久久精品女人天堂| 欧美一级播放| 亚洲你懂的在线视频| 亚洲午夜精品17c| 99视频一区二区| 99精品欧美一区| 亚洲精品韩国| 国产精品日韩一区| 欧美视频在线观看一区| 欧美日韩综合不卡| 欧美日韩亚洲系列| 欧美三级乱码| 欧美午夜美女看片| 久久久女女女女999久久| 欧美在线观看你懂的| 香蕉乱码成人久久天堂爱免费| 小辣椒精品导航| 欧美在线三区| 美女精品在线观看| 欧美激情免费观看| 欧美色欧美亚洲另类七区| 国产精品久久久久久久第一福利| 国产精品久久午夜| 国产亚洲精品激情久久| 精品成人一区二区三区| 亚洲国产黄色片| 一区二区三区回区在观看免费视频| 一本色道精品久久一区二区三区 | 亚洲国产欧美一区二区三区同亚洲 | 亚洲人成毛片在线播放女女| 一区视频在线看| aa级大片欧美三级| 日韩视频在线免费| 一区二区视频免费完整版观看| 亚洲欧洲一区二区三区| 亚洲欧洲在线一区| 亚洲精品视频在线观看网站| 亚洲视频欧美在线| 亚洲欧美清纯在线制服| 欧美在线关看| 久久免费99精品久久久久久| 在线观看亚洲| 国产精品国产精品国产专区不蜜| 欧美日韩美女一区二区| 国产一区二区三区直播精品电影 | 一区二区三区日韩欧美精品| 亚洲一区二区黄色| 欧美在线影院| 麻豆成人av| 欧美日韩久久不卡| 国产精品久久久久影院亚瑟| 在线精品视频一区二区| 99精品视频免费观看| 亚洲欧美日韩国产| 欧美成人免费视频| 9人人澡人人爽人人精品| 亚洲欧美国产高清| 开元免费观看欧美电视剧网站| 国产精品毛片在线看| 1000精品久久久久久久久| 在线视频一区二区| 欧美成人情趣视频| 亚洲一区二区三区色| 蜜月aⅴ免费一区二区三区|