std :: array - '大小为n的缓冲区将溢出',仅在VS中

时间:2016-10-30 21:14:47

标签: 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

1 个答案:

答案 0 :(得分:1)

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中没有任何错误