Force deletion of slot in boost::signals2

前端 未结 5 1165
清歌不尽
清歌不尽 2021-02-05 20:13

I have found that boost::signals2 uses sort of a lazy deletion of connected slots, which makes it difficult to use connections as something that manages lifetimes of objects. I

5条回答
  •  后悔当初
    2021-02-05 20:59

    Is the behaviour any more strict with a scoped_connection?

    So, rather than:

    void Execute() {
        m_WorkerConnection = m_MyWorker.OnWorkDone.connect(boost::bind
            (&Command::Handle_OnWorkComplete, shared_from_this());
    
        // launch asynchronous work here and return
    }
    
    ...
    
    boost::signals2::connection m_WorkerConnection;
    

    Instead using:

    void Execute() {
        boost::signals2::scoped_connection m_WorkerConnection
            (m_MyWorker.OnWorkDone.connect(boost::bind
            (&Command::Handle_OnWorkComplete, shared_from_this()));
    
        // launch asynchronous work here and return
    }   // connection falls out of scope
    

    (copy-constructed from a boost::signals2::connection)

    I've not used any sort of signalling so it's more of a guess than anything else, but following Execute() you wouldn't need to disconnect(), since scoped_connection handles it for you. That's more of a 'simplify the design' rather than actually solving your problem. But it may mean that you can Execute() and then immediately ~Command() (or delete the shared_ptr).

    Hope that helps.

    EDIT: And by Execute() then immediately ~Command() I obviously mean from outside your Command object. When you construct the Command to execute it, you should then be able to say:

    cmd->Execute();
    delete cmd;
    

    Or similar.

提交回复
热议问题