Visual Studio 和 Clang 不会抛出 std::bad_array_new_length
Visual Studio and Clang do not throw std::bad_array_new_length
这是对前一个问题的跟进。
在下面的程序中,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).
相关文章:
- C++11 中不同类型的对象的 std::array 的替代方案
- constexpr begin of a std::array
- C++如果必须在编译时确定大小,std::array 有什么意义?
- OpenGL VBO Indexing ( How to compute Index Array)
- 标准::unordered_map 中的 std::array 的值初始化
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 确保编译时的特定 std::array 位置
- std::array的长度有大小限制吗?
- 将 std::array 移动到另一个 std::array
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays
- 将 **float array 从 C++ Dll 传递给 python
- std::bind on statd::array 的运算符 []
- 检查输入 std::array 指针数据是否等于某个常量数组
- 我可以安全地复制矢量<array>吗?
- 解析问题 - 预期的非限定 ID - #include <array> 编译错误
- 如何读/写或遍历 std::array 中的特定元素范围?
- 通过 host() 从 af::array 检索数据会导致错误的数据
- 是否可以使用 std::array 作为 POD 结构的数据容器?
- 从(bad) array[size]移动到array = new float[size]