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

时间:2010-09-09 05:26:39

标签: 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

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

9 个答案:

答案 0 :(得分:118)

该行:

Time t (12, 0, 0);

...在本地范围内分配Time类型的变量,通常在堆栈上,当其范围结束时将被销毁。

相比之下:

Time* t = new Time(12, 0, 0);

...通过调用::operator new()Time::operator new()来分配一块内存,然后调用Time::Time()并将this设置为该内存块中的地址(和也作为new)的结果返回,然后存储在t中。如您所知,这是通常在堆上完成(默认情况下),并且要求您稍后在程序中delete,而t中的指针通常存储在堆栈上。

答案 1 :(得分:28)

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

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

Time* t = new Time(12, 0, 0);
t->GetTime();

答案 2 :(得分:5)

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

答案 3 :(得分:3)

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

答案 4 :(得分:1)

对象在堆栈上分配并在堆上分配之间没有功能上的区别。两者都将调用对象的构造函数。

顺便提一下,我建议你使用boost的shared_ptr或scoped_ptr,它在堆上分配时也是功能相同的(scoped_ptr的额外用处限制你复制不可复制的指针):

scoped_ptr<Time> t(new Time(12, 0, 0));

答案 5 :(得分:1)

No ..没有其他区别..

答案 6 :(得分:1)

你所知道的没有其他区别。

假设您的代码使用的是默认运营商new的服务。

答案 7 :(得分:1)

  • 使用新的: 调用operator new函数获取动态内存,然后调用constuctor函数。
  • 不使用新的: 不会调用operator new函数,只是直接调用constuctor函数。堆栈将直接使用,没有用于malloc。

答案 8 :(得分:-2)

void foo (Time t)
{
  t = Time(12, 0, 0);
}

void bar (Time* t)
{
  t = new Time(12, 0, 0);
}


int main(int argc, char *argv[])
{
  Time t;
  foo(t);//t is not (12,0,0),its value depends on your defined type Time's default constructor. 

  bar(&t);//t is (12,0,0)
  return 0;
}