2

ポインターをベクターに保持する状況にあり、それらを使用して dtor のメモリを解放できます。

ブースト信号からのコールバック(スロット)をリッスンするオブジェクトがあります。これらのオブジェクトは、作成された場所よりもはるかに後で放出されたブースト信号をリッスンする必要があるため、作成されたメソッドよりも大きなスコープを持つ必要がありました。メモリをヒープに割り当てる必要があり、そのインスタンスを使用して信号をブーストするためにすぐにサブスクライブしました。

これらのオブジェクトは、シグナルを保持しているクラスが破棄されたときにメモリから割り当てを解除する必要があります。

  • ブースト信号が範囲外になり、すべてのリスニング ブースト:バインド オブジェクトが破棄されると、ブーストはこれらすべてのオブジェクトの割り当てを解除しますか??

  • 共有ポインターまたはスマートポインターはこれに役立ちますか?

  • デストラクタで割り当てを解除するには、Signaling Service にこれらすべてのポインタのベクトルを用意する必要がありますか?もっと良い方法はありますか?

    void methodA(){
    
    CallbackHandler* cbHandler=new CallbackHandler(..);    //Allocating in heap as we want to receive boost signals on  
                                                           //this instance even after this method exits
    signalingService.subscribeToCertainSignals(signalType,boost::bind(&CallbackHandler::boostSlotListener,cbHandler,_1));
    }
    
    
    // Boost Signal -SignalingService
     boost::signal<void (const std::string &msg)> signal1;
     boost::signal<void (const std::string &msg)> signal2;
    
     void subscribeToCertainSignals(const std::string& signalType,boost::function<void (const std::string& str)> bindObject){
            this->signal1.connect(bindObject);
            this->signal2.connect(bindObject);
    
     }
     void sendSignals(A a){
         if(check){
            this->signal1("somestring1");
          }else{
            this->signal1("somestring1");
          }
    

    };

4

2 に答える 2

1

これを行う 1 つの方法はshared_ptr、シグナルを保持するオブジェクト内のすべてのリスナーに sを格納weak_ptrし、外部のリスナーに s を格納することです。シグナルを保持しているオブジェクトが破棄されると、各 の参照カウントshared_ptrが移動し0、指しているリスナーが削除されます。次に、シグナルを保持しているオブジェクトの外部からリスナーにアクセスするために s をロックしようとweak_ptrすると、ポイント先が削除されているため、ロックは失敗します - これは がlocknull を返すため、簡単に検出できますshared_ptr

具体的な例を次に示します (残念ながら、要点を説明するために Boost.Signals を使用していません)。

#include <iostream>
#include <memory>
#include <vector>

class Listener
{
public:
    virtual ~Listener() {}
    virtual void signal() = 0;
};

class Subject
{
private:
    std::vector<std::shared_ptr<Listener> > m_listeners;
public:
    void add_listener(const std::shared_ptr<Listener>& listener)
    {
        m_listeners.push_back(listener);
    }

    void signal_all()
    {
        // Note that you could use "auto it = ..." here in C++11.
        for(std::vector<std::shared_ptr<Listener> >::iterator it=m_listeners.begin(), iend=m_listeners.end(); it!=iend; ++it)
        {
            (*it)->signal();
        }
    }
};

class MyListener : public Listener
{
    void signal()
    {
        std::cout << "Signalled!\n";
    }
};

int main()
{
    std::vector<std::weak_ptr<Listener> > listeners;

    {
        Subject s;  

        std::shared_ptr<Listener> listener(new MyListener);
        s.add_listener(listener);
        listeners.push_back(listener);
        listener.reset();

        s.signal_all();

        // Locking the listener yields the listener here.
        std::cout << listeners[0].lock() << '\n';
    }

    // Locking the listener now yields null because s no longer exists.
    std::cout << listeners[0].lock() << '\n';

    return 0;
}

これは以下を出力します:

Signalled!
<some valid non-null address>
00000000
于 2012-04-11T21:35:14.817 に答える