当operator new返回此代码“new T”中的地址时会发生什么?

时间:2013-03-16 12:43:36

标签: c++ constructor new-operator

class T{
public:
    T(){}
};

int main ()
{
  T *t = new T; //line 8

}

我的意思是在输入构造函数之前代码是怎样的?例如,在第8行中,运算符new返回地址,然后代码看起来像T *t = T 0x0FF00,因为它类似于对象定义,不能像0x0FF00 T。因此,如果它是真的,那么运算符new返回的地址如何位于T类之后,那么运算符new之前是否会返回它?

1 个答案:

答案 0 :(得分:3)

T *t = new T;
//     ^^^^^

这是tT*的声明。它由=之后的表达式初始化。整个new T部分是此初始值设定项中的 new-expression

new-expression 导致为类型为T的对象分配内存,然后在该空间中构造该对象。 new-expression 返回指向该对象的指针。也就是说,在评估 new-expression 之后,该行现在看起来像:

T *t = returned_pointer;

我假设您使用0x0FF00作为示例内存地址 - 在这种情况下,您可以想象该行已成为:

T *t = 0x0FF00; // Note: this wouldn't actually compile because 0x0FF00 is an integer literal

现在使用该内存地址初始化指针t

您可能会对 new-expression 的确切含义感到困惑。它有以下两个步骤:

  1. 它调用适当的分配函数(通常为operator new),传递存储类型为T的对象所需的内存大小。 operator new分配该内存并返回指向该位置的地址。

  2. 然后初始化该空间中T类型的对象。