2016-06-01 13 views
3

これは、prior questionまでのフォローアップです。Visual StudioとClangはstd :: bad_array_new_lengthをスローしません

次のプログラムでは、Visual Studio 2015 and Clangは両方ともstd::bad_array_new_lengthをスローしません。 gcc does

#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にはエラーはありません(this answerで言及されているavoided the allocationなので)。

3つのコンパイラ、3つの結果。これは未定義の動作ですか?これはVisual Studioのバグですか?

答えて

3

GCCが正しい場合、動作は標準によって定義されます。

$5.3.4/7 New [expr.new]

noptr-新宣言子で式があれば誤りである:

...

(7.4) - 新しい-初期化子がブレース-INIT-リストです初期化子が提供される 配列要素の数(文字列リテラル(2.13.5)の末尾に '\ 0'を含む )は、初期化する要素の数を超えています。タイプの

...

誤った表現で新しい式が 配分機能を呼び出し、ハンドラ(15.3)にマッチするタイプ の例外をスローすることによって終了しないstd::bad_array_new_length (18.6 2.2)。

関連する問題