问题背景:
- TaskProcessor.h类会在内部创建一个线程。将任务路由到这个线程处理。
- 这个问题我已经知道将 “SetListener(TestListener* listener)”方法中的lamdba表达改为
[this, listener]()
,通过值捕获就能正常运行
问题:如下这段C++代码运行会报错。报错行数是"test_listener_->OnReceiver();"。错误信息有两个
- error: <user expression 1>:1:1: use of non-static data member 'test_listener_' of 'TestManager' from nested type ''
- EXC_BAD_ACCESS (code=1, address=0x7669656365526e5f)
我就想知道我写成按照引用捕获为啥会出错。出错的原因是什么?而且在使用 test_listener_ 代理前我都打印了地址,都是正确的。感谢您的指点 感激不尽 祝您工作顺利
#include <iostream>
#include "TaskProcessor.h"
using namespace CallPlugin;
class TestListener {
public:
virtual ~TestListener() {}
virtual void OnReceiver() = 0;
};
class TestManager {
public:
TestManager():task_processor_(std::make_unique<TaskProcessor>()) {
std::cout << "TestManager()" << std::endl;
}
~TestManager() {
std::cout << "~TestManager()" << std::endl;
}
void SetListener(TestListener* listener) {
task_processor_->SyncTask(FROM_HERE, [&](){
test_listener_ = listener;
std::cout << "-----SetListener-->>test_listener_: "<<(void *)test_listener_<< std::endl;
});
}
void OnReceiver() {
task_processor_->SyncTask(FROM_HERE, [&](){
std::cout << "-----OnReceiver-->>test_listener_: "<<(void *)test_listener_<< std::endl;
test_listener_->OnReceiver();
});
}
private:
TestListener* test_listener_;
std::unique_ptr<TaskProcessor> task_processor_;
};
class ListenerImpl : public TestListener {
public:
ListenerImpl() {
std::cout<<"ListenerImpl()"<<std::endl;
}
~ListenerImpl() override {
std::cout<<"~ListenerImpl()"<<std::endl;
}
void OnReceiver() override {
std::cout<<"ListenerImpl-->OnReceiver"<<std::endl;
}
};
int main() {
ListenerImpl* listenerImpl = new ListenerImpl();
TestManager testManager;
testManager.SetListener(listenerImpl);
testManager.OnReceiver();
std::cout << "sleep_for"<< std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(10000));
delete listenerImpl;
std::cout << "Hello, World!" << std::endl;
return 0;
};