evpp
evpp copied to clipboard
evpp 一个诡吊的BUG,能力有限,找不出原因来
先说下环境。只有一台linux的虚拟主机(XUbuntu 18.04, g++ 7.3)出现,而且是必现。而且另一台 Ubuntu 和 windows不会出现。
int main(int argc, char const *argv[])
{
std::cout << "This is test" << std::endl;
EventLoop* loop = new EventLoop();
loop->RunAfter(Duration(1.0), [&loop]() {
std::cout << "callback time ...." << std::endl;
loop->Stop();
});
loop->Run();
std::cout << "exit...." << std::endl;
delete loop;
std::cout << "END." << std::endl;
return 0;
}
然后输出:崩溃了。
This is test
callback time ....
double free or corruption (out)
已放弃 (核心已转储)
查了 InvokerTimer 的代码
void InvokeTimer::OnTimerTriggered() {
DLOG_TRACE << "loop=" << loop_ << " use_count=" << self_.use_count();
functor_();
if (periodic_) {
timer_->AsyncWait();
} else {
functor_ = Functor();
cancel_callback_ = Functor();
timer_.reset();
self_.reset();
}
}
把 timer_.reset() 去掉,程序就正常 了。但觉得奇怪。这里没有多重释放。而且去掉以后,timer就没有释放了。
然后我又再做了另一个测试
void callback(EventLoop* loop) {
std::cout << "callback time ...." << std::endl;
loop->Stop();
}
int main(int argc, char const *argv[])
{
std::cout << "This is test" << std::endl;
EventLoop* loop = new EventLoop();
TimerEventWatcher timer(loop, std::bind(callback, loop), Duration(1.0));
timer.Init();
timer.AsyncWait();
loop->Run();
std::cout << "exit...." << std::endl;
delete loop;
std::cout << "END." << std::endl;
return 0;
}
不用 RunAfter .直接用 TimerEventWatcher. 然后时间到了以后,loop->Stop() 退出。 运行以后,依然崩溃。也是说 double free 。
This is test
callback time ....
double free or corruption (out)
已放弃 (核心已转储)
试了无数次,然后把程序改成用 RunEvery 不用RunAfter
int main(int argc, char const *argv[])
{
std::cout << "This is test" << std::endl;
EventLoop* loop = new EventLoop();
loop->RunEvery(Duration(1.0), [&loop]() {
std::cout << "callback time ...." << std::endl;
loop->Stop();
});
loop->Run();
std::cout << "exit...." << std::endl;
delete loop;
std::cout << "END." << std::endl;
return 0;
}
神奇的正常了。。。。。 感觉BUG很奇怪。能力有限,解释不不了。 各位大侠有什么看法。