【问题标题】:Access violation only in release x64访问冲突仅在 x64 版本中
【发布时间】:2019-12-09 04:44:54
【问题描述】:

<random> 标头在非常奇怪的情况下出现访问冲突。这是编译器错误吗?代码如下:

#include <random>

class Foo {
public:
    std::random_device rd;
    std::mt19937_64 mt;
    std::uniform_int_distribution<int> dist;

    Foo();
};

Foo::Foo() : mt(rd()) {
    dist = std::uniform_int_distribution<int>(0, 1);
}

int main() {
    Foo foo;

    int a[2];

    int b[2] = { 0 };

    for (int i = 0; i < 2; i++) {
        int c = foo.dist(foo.mt);
        a[0] = b[c];
        b[c] = b[0];
    }
}

如果我将 for 循环替换为以下内容,则代码可以正常工作而不会违反访问权限!

{
    int c = foo.dist(foo.mt);
    a[0] = b[c];
    b[c] = b[0];
}

{
    int c = foo.dist(foo.mt);
    a[0] = b[c];
    b[c] = b[0];
}

这仅适用于 x64 版本,我从一个“空项目”开始。对我来说,这似乎是一个错误。我错过了什么吗?

【问题讨论】:

  • “这是编译器错误”这个问题的答案是“几乎可以肯定不是”。
  • 你不好奇c的值可能是多少吗?
  • 显然是编译器错误...报告它:帮助 -> 发送反馈 -> 报告问题...
  • 我在 Visual Studio 2019 中重现了 x64 发布模式下的崩溃。版本 16.1.3
  • 在 Visual Studio 2017 版本 15.9.11 中复制。在类似条件下来自 cppref 的示例效果很好 en.cppreference.com/w/cpp/numeric/random/…

标签: c++ visual-studio visual-studio-2019


【解决方案1】:

这是优化器的一个错误,它将用于有符号整数的模式应用于无符号整数。

我报告了这个错误,微软的 David Hartglass 回复了here。该错误目前正在处理中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    相关资源
    最近更新 更多