关于c ++:使用new和without实例化对象之间的区别是什么

What is difference between instantiating an object using new vs. without

在C ++中,

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

1
2
3
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将需要删除,因为它是在堆上分配的。 还有其他区别吗?


这条线:

1
Time t (12, 0, 0);

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

相比之下:

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

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


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

1
2
3
4
5
Time t (12, 0, 0);
t.GetTime();

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


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


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


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

你已经知道的没有其他区别。

假设您的代码使用默认运算符new的服务。


不..没有其他区别..


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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}