Visual Studio 和 Clang 不会抛出 std::bad_array_new_length

Visual Studio and Clang do not throw std::bad_array_new_length

本文关键字:bad array length new std Studio Clang Visual      更新时间:2023-10-16

这是对前一个问题的跟进。

在下面的程序中,Visual Studio 2015 和 Clang 都不会抛出std::bad_array_new_length . gcc 会。

#include <iostream>
#include <random>
#include <exception>
#include <new>
int main()
{
    std::random_device rd;
    std::uniform_int_distribution<int> dist(2,2);
    try {
        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;
    }
    catch (std::exception const& e) {
        std::cerr << e.what() << 'n';
    }
    return 0;
}

在Visual Studio中,程序崩溃而没有任何消息。在Clang中没有错误(可能是因为它避免了本答案中提到的分配)。

三个

编译器,三个结果。这是未定义的行为还是Visual Studio中的错误?

GCC 是正确的,行为由标准定义。

$5.3.4/7 New [expr.new]

在以下情况下,noptr-new-declarator 中的表达式是错误的:

(7.4) — new-initializer 是一个大括号的初始化列表,并且 为其提供初始值设定项的数组元素(包括 在字符串文本 (2.13.5) 中终止"\0"超过 元素进行初始化。

具有错误表达式的新表达式不会调用 分配函数并通过抛出类型的异常来终止 这将匹配类型 std::bad_array_new_length 的处理程序 (15.3) (18.6.2.2).