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::callback
是 callback
. 的副本
我决定最近开始学习 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::callback
是callback
. 的副本