C++ lambda pointer/reference 内存占用之争

C++ lambda pointer/reference memory occupation struggle

我决定最近开始学习 C++;来自脚本背景 (Ruby、JavaScript、PHP)。我已经开始构建一个非常简单的 observer。我想要实现的是 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 实例被销毁时,它所有附加的观察者也被销毁,以释放内存。这只是一个想法,在 "ideal" 实现方面可能是错误的,也不确定我是否应该这样清理内存,我还没有尝试过智能指针。

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

};

我计划为我的观察者传递 callback 作为指向 setCallback() 函数的指针,因此我可以在从主题中删除观察者实例时删除它。现在我的主要问题是如何取消分配已被我的回调(现在是观察者 属性)占用的内存?

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

由于 setCallback 方法引用了您的回调,因此此方法看到的值与您的 main 方法相同。但是,您不存储对回调的引用,而是存储回调的副本。所以要明确这一点:

  • customCallback为原值
  • callback 是对 customCallback.
  • 的引用
  • Observer::callbackcallback.
  • 的副本