C ++ lambda指针/引用内存占用斗争

时间:2015-01-19 21:48:29

标签: c++ pointers memory-management reference pass-by-reference

我最近决定开始学习 C ++;来自脚本背景(Ruby,JavaScript,PHP)。我已经开始构建一个非常简单的观察者。我想要实现的是notify方法的自定义回调,如下所示:

#include <iostream>
#include <functional>

using namespace std;

template<class StateT>
class Observer{

    typedef function<void(StateT)> LambdaT;

    LambdaT callback;

    ~Observer(){
        //delete callback;
    };

public:

    void setCallback(LambdaT &callback)
    {
        this->callback = callback;
    };

    void notify(StateT state){
      this->callback(state);
    };


};

int main(int argc, char** argv) {

    Observer<string>* obs = new Observer<string>;

    std::function<void(string)> customCallback = [](string state){
        cout << state << endl;
    };

    obs->setCallback(customCallback);

    obs->notify("State has changed");

    return 0;
}

然后我有一个Subject来观察,当Subject实例被摧毁时,所有它附加的观察者也被摧毁,以释放记忆。这只是一个想法,这可能是错误的&#34;理想&#34;实现,也不确定我是否应该如何清理内存,我还没有尝试过智能指针。

~Subject(){
    for(listIterator......){
        delete (*it); //observer instances pointers are stored in a list
    }

};

我打算为我的观察者传递回调,作为指向setCallback()函数的指针,所以我可以删除它,因为我从subject中删除了观察者实例。现在我的主要问题是如何解除分配已被回调占用的内存(现在是一个观察者属性)?

1 个答案:

答案 0 :(得分:1)

你不是。回调属性不是动态分配的。您只需要确保取消分配您的观察者。根据经验,每个delete应该有一个new。由于您从不使用新的LambdaT,因此无需删除。

由于setCallback方法引用了您的回调,因此此方法与main方法的值相同。但是,您不存储对回调的引用,而是存储回调的副本。所以说清楚:

  • customCallback是原始值。
  • callback是对customCallback
  • 的引用
  • Observer::callbackcallback
  • 的副本