使用new和without实例化一个对象有什么不同

在C ++中,

除了dynamic内存分配,以下两行代码之间还有一个function差异:

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

该行:

 Time t (12, 0, 0); 

…在本地范围内分配一个Timetypes的variables, 一般在堆栈上,当它的作用域结束时它将被销毁。

相比之下:

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

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

一个更明显的区别是访问t的variables和方法。

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

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

我想你已经明白了所有的差异。 假设你很清楚通过指针和variables访问t成员的语法差别(当然,指针也是一个variables,但我想你明白我的意思)。 并且假设你知道通过函数传递t时值和call的引用差别。 而且我想你也明白如果你把t赋给另外一个variables并通过其他variables进行修改会发生什么。 结果会根据t是否是指针而不同。

在将对象分配到堆栈上并将其分配给堆之间没有function差异。 两者都会调用对象的构造函数。

顺便说一下,我build议你使用boost的shared_ptr或scoped_ptr,这在function上也是等效的,当在堆上分配时(scoped_ptr限制你复制不可复制的指针)。

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

没有 ..没有其他的区别..

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

假设你的代码正在使用默认的operator new服务。

  • 使用new:调用operator new函数获取dynamic内存,然后调用构造函数。
  • 不使用new:不会调用operator new函数,只是直接调用constuctor函数。 堆栈将被直接使用,对malloc没有用处。
 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; }