2016-06-01 8 views
3

Dies ist ein Follow-up zu einem prior question.Visual Studio und Clang werfen nicht std :: bad_array_new_length

In dem folgenden Programm Visual Studio 2015 and Clang beide werfen nicht std::bad_array_new_length. gcc does.

In Visual Studio stürzt das Programm ohne Nachricht ab. In Clang gibt es keinen Fehler (vielleicht weil avoided the allocation wie in this answer erwähnt).

Drei Compiler, drei Ergebnisse. Ist dieses undefinierte Verhalten oder ist das ein Fehler in Visual Studio?

Antwort

3

GCC ist korrekt, das Verhalten ist durch den Standard definiert.

$5.3.4/7 New [expr.new]

Der Ausdruck in einem noptr-new-declarator fehlerhaft ist, wenn:

...

(7.4) - die neuen-Initialisierer a verspannt-init-Liste und die Anzahl der Array-Elemente, für die Initialisierungen bereitgestellt werden (einschließlich der , die '\ 0' in einem Zeichenfolgeliteral (2.13.5) beendet), überschreitet die Anzahl der zu initialisierenden Elemente .

...

ein neuer Ausdruck mit einem fehlerhaften Ausdruck keine Zuordnungsfunktion und endet durch Auslösen einer Ausnahme eines Typs nicht aufrufen, die einen Handler (15.3) vom Typ entsprechen würde std::bad_array_new_length (18.6 .2.2).