Es" sizeof new int; " comportamiento indefinido?


Código:

#include<iostream>

using namespace std;

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

    cout<<i;
}

En el compilador GCC, funcionando bien sin ningún tipo de advertencia o error y salida impresa 8.

Pero, en el compilador de clang, recibí la siguiente advertencia:

warning: expression with side effects has no effect in an unevaluated context [-Wunevaluated-expression]
    size_t i = sizeof new int;
  • ¿Cuál es verdadero?
  • Es sizeof new int; comportamiento indefinido?
Author: doppelgreener, 2018-10-03

2 answers

La advertencia no indica que es UB; simplemente dice que el contexto de uso, es decir, sizeof, no activará los efectos secundarios (que en el caso de new está asignando memoria).

[expr.tamaño de] El operador sizeof produce el número de bytes ocupados por un objeto no potencialmente superpuesto del tipo de su operando. El operando es una expresión, que es un operando no evaluado ([expr.prop]), o un id de tipo entre paréntesis.

El estándar también amablemente explica lo que eso significa:

[expr.context] (...) No se evalúa un operando no evaluado.

Es una multa, aunque una forma extraña de escribir sizeof(int*).

 58
Author: Bartek Banachewicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-03 10:03:57

new operator devuelve el puntero a la memoria asignada. new int devolverá un puntero, por lo tanto sizeof new int; devolverá el tamaño de un puntero. Este es un código válido y no hay comportamiento indefinido aquí.

La advertencia es legítima y solo advierte sobre el efecto del efecto secundario en el operando y eso es porque los operandos de sizeof no se evalúan.

Por ejemplo:

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
 17
Author: haccks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-03 15:16:07