是“ sizeof new int”;未定义的行为?

时间:2018-10-03 10:01:57

标签: c++ c++11 g++ sizeof clang++

代码:

#include<iostream>

using namespace std;

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

    cout<<i;
}

在GCC编译器中,工作正常,没有任何警告或错误,并显示了输出8

但是,在clang编译器中,我收到以下警告:

warning: expression with side effects has no effect in an unevaluated context [-Wunevaluated-expression]
    size_t i = sizeof new int;
  • 哪个是真的?
  • sizeof new int;是未定义的行为吗?

2 个答案:

答案 0 :(得分:61)

该警告并没有说明它是UB。它只是说使用上下文,即sizeof不会触发副作用(在new的情况下,这是分配内存)。

  

[expr.sizeof]   sizeof运算符产生其操作数类型的非潜在重叠对象占用的字节数。操作数可以是一个表达式,它是未计算的操作数([expr.prop]),或者是带括号的type-id。

该标准还有助于解释其含义:

  

[expr.context] (...)不评估未评估的操作数。

这很好,尽管写sizeof(int*)的方法很怪。

答案 1 :(得分:19)

new操作符返回指向分配的内存的指针。 new int将返回一个指针,因此sizeof new int;将返回一个指针的大小。这是有效的代码,此处没有未定义的行为

警告是合法的,并且仅警告副作用对操作数的影响,这是因为未评估sizeof的操作数。

例如:

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