gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:28:32 25 4
gpt4 key购买 nike

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

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 时,您正在访问一个悬空引用。

此处的解决方案是改为按值(value)捕获。这意味着您将获得一份拷贝,并且何时调用 operator() 并不重要,因为 lambda 不依赖于任何东西。

关于变量周围的 C++ 堆栈已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46526679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com