0

我使用 C++11thread类创建了一个线程,我希望线程在循环中休眠。
调用该this_thread::sleep_for()函数时,我收到异常消息:

运行时检查失败 #2 - 变量“_Now”周围的堆栈已损坏。

我的代码如下:

std::chrono::milliseconds duration( 5000 );
while (m_connected)
{
    this->CheckConnection();
    std::this_thread::sleep_for(duration);
}
4

1 回答 1

0

我认为_Now是在sleep_for. 如果它被损坏,要么该函数中存在错误(不太可能),要么应用程序的某些其他部分正在写入悬空指针(更有可能)。

最可能的原因是您在调用 之前的某个时间sleep_for,给出了指向局部变量的指针,该局部变量在该线程休眠时由其他线程写入并保留。

如果您在 Linux 上,我建议您尝试valgrind(尽管我不确定它是否可以捕获对堆栈的无效访问),但在 Windows 上,我不知道有任何工具可以调试此类问题。您可以进行仔​​细审查,并且可以尝试禁用功能的各个部分以查看问题何时消失以缩小可能出现的范围。

我也曾经成功地使用过 duma库,但它只能捕获对堆的无效访问,而不是堆栈。

注意:clang 和 gcc 在实现 C++11 方面比 MSVC++ 更进一步,所以如果你不使用太多 Windows 特定的东西,它可能很容易移植并在其上尝试 valgrind。Gcc 尤其是 clang 也以提供比 MSVC++ 更好的静态诊断而闻名,因此如果您使用 gcc 或 clagn 编译它,您可能会收到一些警告,指出问题所在。

于 2013-06-13T09:51:44.577 回答