我使用C ++ 11 thread
类创建了一个线程,我希望线程在循环中休眠
调用this_thread::sleep_for()
函数时,我得到例外说法:
运行时检查失败#2 - 堆栈变量'_Now'是 损坏。
我的代码如下:
std::chrono::milliseconds duration( 5000 );
while (m_connected)
{
this->CheckConnection();
std::this_thread::sleep_for(duration);
}
答案 0 :(得分:0)
我认为_Now
是sleep_for
实施深处的局部变量。如果它被破坏,那么该函数中存在错误(不太可能)或者应用程序的某些其他部分正在写入悬空指针(更有可能)。
最可能的原因是,在调用sleep_for
之前的某个时间,给出了指向本地变量的指针,该变量保留在其中并且在此线程休眠时被其他线程写入。
如果您使用的是Linux,我建议您尝试valgrind(虽然我不确定它是否可以捕获无效的堆栈访问权限),但是在Windows上我不知道有任何用于调试此工具的工具有点问题。您可以仔细检查,然后尝试禁用功能的各个部分,以查看问题何时消失以缩小可能的范围。
我还习惯使用duma库取得了一些成功,但它只能捕获对堆的无效访问,而不是堆栈。
注意:clang和gcc都在实现C ++ 11而不是MSVC ++,所以如果你不使用很多特定于Windows的东西,可能很容易移植并尝试使用valgrind。 Gcc和特别是clang也因提供比MSVC ++更好的静态诊断而闻名,所以如果你用gcc或clagn编译它,你可能会得到一些警告,指出你的问题。