使用new与without实例化对象之间的区别是什么

man*_*704 99 c++ constructor new-operator

在C++中,

除了动态内存分配之外,以下两行代码之间是否存在功能差异:

Time t (12, 0, 0); //t is a Time object

Time* t = new Time(12, 0, 0);//t is a pointer to a dynamically allocated Time object
Run Code Online (Sandbox Code Playgroud)

我当然假设定义了一个Time(int,int,int)ctor.我也意识到在第二种情况下,t将需要删除,因为它是在堆上分配的.还有其他区别吗?

gre*_*ade 119

这条线:

Time t (12, 0, 0);
Run Code Online (Sandbox Code Playgroud)

... Time在本地范围内分配一个类型的变量,通常在堆栈上,当它的作用域结束时将被销毁.

相比之下:

Time* t = new Time(12, 0, 0);
Run Code Online (Sandbox Code Playgroud)

...通过调用::operator new()或分配一块内存Time::operator new(),然后Time::Time()使用thisset 调用该内存块中的一个地址(并且还作为结果返回new),然后存储在该内存块中t.如你所知,这是一般的堆(默认)完成,并要求您delete在以后的节目,而指针t一般存储在堆栈上.

  • @Sev:一般接近开头.对于POD类,它将在或接近开头,对于具有虚拟成员和/或继承的类,指针通常会在块内更远,以便为vtable和继承成员腾出空间(如果有的话). (2认同)
  • @greyfade:在第二行代码中,t是指向Time的指针,我意识到t指向一个在堆上分配的Time类型的对象,但它本身是在堆栈还是堆上分配的? (2认同)
  • @Calpis:`t`是在本地范围内声明的"自动变量".所以是的,它通常在堆栈上分配.但它通常与讨论无关,因为它只是*指向"时间"对象. (2认同)

Man*_*j R 31

另一个明显的区别是访问t的变量和方法.

Time t (12, 0, 0);
t.GetTime();

Time* t = new Time(12, 0, 0);
t->GetTime();
Run Code Online (Sandbox Code Playgroud)


Ate*_*ral 5

就构造函数而言,这两种形式在功能上是相同的:它们只会导致在新分配的对象实例上调用构造函数.您似乎已经很好地掌握了分配模式和对象生命周期方面的差异.


tas*_*oor 4

我认为您已经了解所有差异。假设您非常了解通过指针和变量访问 t 成员的语法差异(好吧,指针也是一个变量,但我想您明白我的意思)。并假设您知道将 t 传递给函数时按值调用和按引用调用的区别。我认为您也了解如果将 t 分配给另一个变量并通过该另一个变量进行更改会发生什么。根据 t 是否为指针,结果会有所不同。