2016-06-01 2 views
1

なぜ以下のことが可能ですか?ランダムな値が答えと同様に初期化リストが動的多次元配列のメモリを上書きします

2. here発見された場合

#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

array-new式の初期化子が多すぎる場合、コンパイラはbad_array_new_length型の例外のスローを生成する必要があります。

g ++ 6.1は期待通りにbad_array_new_lengthを投げます。 clangはそうではありませんが、これは割り当てを取り除くことができるためです(Clang fails to throw a std::bad_alloc when allocating objects that would exceed the limit)。割り当てが強制的に発生すると、clangは例外をスローしますが、of the wrong typestd::bad_alloc)です。

Example

terminate called after throwing an instance of 'std::bad_array_new_length' 
    what(): std::bad_array_new_length 
関連する問題