繁体   English   中英

C ++变量周围的堆栈已损坏

[英]C++ Stack around variable is corrupted

我正在尝试实现一个计时器,该计时器将函数指针作为参数和以毫秒为单位的时间。 时间过去之后,应在单独的线程中调用该函数。 该代码如下所示:

class timer
{
public:
    void schedule(void(*function)(), int time)
    {
        std::thread t = std::thread([&]
            {
                std::this_thread::sleep_for(std::chrono::milliseconds(time));
                function(); 
            });
        t.detach();
    }
};

主要方法如下:

#define LOG(x) std::cout << x << std::endl;


timer t1;
timer t2;
timer t3;
t1.schedule([] {LOG("t1 done")}, 2000);
t2.schedule([] {LOG("t2 done")}, 3000);
t3.schedule([] {LOG("t3 done")}, 4000);
std::this_thread::sleep_for(std::chrono::seconds(20));

异常如下:

Run-Time Check Failure #2 - Stack around the variable 't1' was corrupted.

这里的问题是您正在通过lambda中的引用来捕获。 这意味着您可以在调用lambda的operator()之前调用detach并退出schedule 如果发生这种情况,那么当您尝试使用time您将访问悬挂的参考。

解决方案是按值捕获。 这意味着您将获得一份副本,而调用operator()则无所谓,因为lambda并不依赖任何东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM