初始化列表覆盖动态多维数组的内存

时间:2016-06-01 15:41:54

标签: c++

为什么允许以下内容?

#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]{ Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference
        at com.example.sra.hellosrilanka.DBAccess.getQuotes(DBAccess.java:51)
        at com.example.sra.hellosrilanka.ContactView.onCreate(ContactView.java:29)
,{{2}},here}; // 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,则初始化程序将写入未分配的内存。

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

1 个答案:

答案 0 :(得分:2)

如果array-new表达式的初始化程序太多,则需要编译器生成类型bad_array_new_length的异常抛出。

g ++ 6.1确实按预期发出了git-clone的抛出; clang没有,但这是因为它能够消除分配(Clang fails to throw a std::bad_alloc when allocating objects that would exceed the limit)。如果强制进行分配,则clang会抛出异常但of the wrong typebad_array_new_length)。

Example

std::bad_alloc