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

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

}

我的意思是代码在进入构造函数之前是什么样子的?例如,在第 8 行 operator new 返回地址,然后代码看起来像T *t = T 0x0FF00,因为它像对象定义,不能像0x0FF00 T。因此,如果它是真的,这个由 operator new 返回的地址如何位于类型 T 之后,尽管 operator new 之前返回它?

4

1 回答 1

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

这是一个t类型的声明T*。它由 . 之后的表达式初始化=。整个new T部分是此初始化程序中的新表达式

new 表达式导致为类型对象分配内存,然后T在该空间中构造该对象。new 表达式返回一个指向该对象的指针。也就是说,在对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),传递存储类型对象所需的内存大小Toperator new分配该内存并返回指向该位置的地址。

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

于 2013-03-16T12:53:59.963 回答