it-swarm.com.de

Ist "sizeof new int;" undefiniertes Verhalten?

code:

#include<iostream>

using namespace std;

int main() 
{
    size_t i = sizeof new int;

    cout<<i;
}

Funktioniert im GCC-Compiler einwandfrei, ohne Warnung oder Fehler, und es wird eine gedruckte Ausgabe 8.

Aber im Clang-Compiler habe ich folgende Warnung erhalten:

warning: expression with side effects has no effect in an unevaluated context [-Wunevaluated-expression]
    size_t i = sizeof new int;
  • Welches ist wahr?
  • Ist sizeof new int; undefiniertes Verhalten?
32
msc

Die Warnung besagt nicht, dass es sich um UB handelt. es heißt lediglich, dass der Anwendungskontext, nämlich sizeof, die Nebenwirkungen nicht auslöst (was im Fall von new Speicher zuweist).

[expr.sizeof] Der Operator sizeof gibt die Anzahl der Bytes an, die von einem nicht potenziell überlappenden Objekt des Typs seines Operanden belegt werden. Der Operand ist entweder ein Ausdruck, bei dem es sich um einen nicht bewerteten Operanden ([expr.prop]) handelt, oder eine Typ-ID in Klammern.

Der Standard erklärt auch hilfreich, was das bedeutet:

[expr.context] (...) Ein nicht ausgewerteter Operand wird nicht ausgewertet.

Es ist eine feine, obwohl seltsame Art, sizeof(int*) zu schreiben.

61

Der Operator new gibt den Zeiger auf den zugewiesenen Speicher zurück. new int gibt einen Zeiger zurück, daher sizeof new int; gibt die Größe eines Zeigers zurück. Dies ist ein gültiger Code und es gibt kein ndefiniertes Verhalten hier.

Warnung ist legitim und warnt nur vor der Auswirkung von Nebenwirkungen auf den Operanden, da die Operanden von sizeof nicht ausgewertet werden.

Beispielsweise:

int i = 1;
std::cout << i << '\n';     // Prints 1
size_t size = sizeof(i++);  // i++ will not be evaluated
std::cout << i << '\n';     // Prints 1
19
haccks