初始值设定项列表覆盖动态多维数组的内存

Initializer list overwrites memory for dynamic multi dimensional array

本文关键字:动态 数组 内存 覆盖 列表      更新时间:2023-10-16

为什么允许以下内容?

#include <iostream>
#include <random>
int main()
{
    std::random_device rd;
    std::uniform_int_distribution<int> dist(2,3);
    auto arr = new int[dist(rd)][4][2]{{{1}},{{2}},{{3}}}; // may write to unallocated memory
    auto val1 = arr[0][0][0];
    auto val2 = arr[1][0][0];
    auto val3 = arr[2][0][0];
    auto result = val1 + val2 + val3;
    std::cout << result;
    return 0;
}

如果随机值为 2,则初始值设定项将覆盖未分配的内存。

与此处找到的答案类似,我不希望编译器允许这样做。

> 如果数组新表达式的初始值设定项太多,编译器需要生成 bad_array_new_length 类型的异常的引发。

G++ 6.1 确实会按预期发出bad_array_new_length;Clang 不会,但这是因为它能够消除分配(当分配超出限制的对象时,Clang 无法抛出 std::bad_alloc)。如果强制进行分配,则 clang 会抛出异常,但类型错误 ( std::bad_alloc )。

例:

terminate called after throwing an instance of 'std::bad_array_new_length'
  what():  std::bad_array_new_length