初始值设定项列表覆盖动态多维数组的内存
Initializer list overwrites memory for dynamic multi dimensional array
为什么允许以下内容?
#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
相关文章:
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 输出没有重复元素的动态数组(收缩数组)C++
- 正在插入动态数组
- 如何在动态数组上使用搜索函数
- C++ 动态数组每次添加时将大小增加 1 - 错误
- 静态数组的自由动态数组
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 使用 thread 类在 C++ 中构造线程的动态数组时出错
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- C++ 使用存储在动态数组中的文本文件中的数据查找模式
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- 为什么 c++ 动态数组的大小没有改变?
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 指针的 C++ 动态数组 - 何时需要使用它?
- 删除动态数组时未定义标识符
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- 如何将字符串和整数读取到两个单独的动态数组中的程序编写?
- 动态数组的 C++ 重载加运算符
- 基于数组的列表 - 动态数组创建时出错