簡體   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