c++ - std::array - 'buffer of size n will be overrun' ,仅在 VS 中

标签 c++ visual-studio c++11 visual-c++ visual-studio-2015

constexpr auto CHUNKS_X = 5, CHUNKS_Y = 5, CHUNKS_Z = 1;
std::array<std::bitset<CHUNKS_X>, CHUNKS_Y> ys;
std::array<decltype(ys), CHUNKS_Z> zs;
if (CHUNKS_Z > 1)
{
    zs[0] = ys;
    //zs.at(1) = ys; //this works
    zs[1] = ys; //this doesn't work
    for (auto &x : zs[1])
    {
        x.flip();
    }
    for (auto z = 2; z < CHUNKS_Z; z++)
    {
        zs[z] = zs[z - 2];
    }
}

zs[1] = ys; 给了我

error C4789: buffer 'zs' of size 20 bytes will be overrun; 20 bytes will be written starting at offset 20

但只有在VS中编译时。在命令行上编译没有给我这样的错误,使用 zs.at(1) = ys; 也没有。另一件值得注意的事情是 MSDN 说这应该是警告,而不是错误。

我意识到这可能是一个微妙的编译器标志问题,但我不知道从哪里开始寻找。

Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x86

最佳答案

std::array<decltype(ys), CHUNKS_Z> zs;

相当于

std::array<decltype(ys), 1> zs;

意思是zs是一个有1个元素的数组;

数组通常是从零开始的,这意味着第一个元素位于 zs[0],并且没有更多元素,因此 zs[1] 要求数组将有第二个元素,它在您的示例中没有。

因为你检查了 if (CHUNKS_Z > 1) 应该没有任何问题,因为你无法到达 zs[1] = ys; 行,你赢了'遇到任何问题。

如果我将 CHUNKS_Z 更改为 2 我不会在 VS15 中收到任何错误

关于c++ - std::array - 'buffer of size n will be overrun' ,仅在 VS 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40333694/

相关文章:

c++ - Cython 为 libcpp.list 赋值

c++ - destroyWindow(来自 opencv)关闭所有窗口并停止 c++ 程序

visual-studio - 如何在解决方案之间移动现有的 VS 项目?

visual-studio - 如何终止 Visual Studio 中预构建步骤中可能不存在的进程?

visual-studio - 在 Visual Studio 2012 中,尝试使用 React JS 编写 JSX 时收到警告和波浪线

c++ - 模板参数循环依赖

c++ - C/C++ 中的快速字符串标记化

c++ - cv::DataType<> 与 cv::traits::Type<>

c++ - 如何为模板方法创建别名

c++ - std::sort 降序与运算符重载