2010-09-09 91 views
72

在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。我也意识到,在第二种情况下,由于它是在堆上分配的,因此需要删除它。还有其他的区别吗?

+7

它并没有真正算作答案,但是除了已经给出的答案,您可能有兴趣知道如果要编写自己的内存管理(以获得更好的性能),可以重写操作符new/delete。 – 2010-09-09 06:04:27

回答

2

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

102

线:

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一般存储在堆栈上。

+5

+1可能导致'operator new()'过载+1 – Anthony 2010-09-09 06:43:14

+5

+1:也会说堆栈分配**应该快于堆分配。 – 2010-09-09 08:17:31

+0

“该内存块中的地址” - 该块中的任何地址或特定位置(如开头)的任何地址? – Sev 2010-09-09 08:27:06

5

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

1

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

顺便说一句,我建议你使用boost的shared_ptr的或scoped_ptr的在堆中分配(与scoped_ptr的附加实用性抄袭不可复制三分球约束你)时,这也是功能上等同:

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

No ..没有其他区别..

1

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

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

22

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

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

Time* t = new Time(12, 0, 0); 
t->GetTime(); 
-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; 
} 
+0

我认为你的评论“// t不是(12,0,0),它的值取决于你定义的类型Time的默认构造函数。”适用于它上面的行,即对象t(时间t;)的声明。 – AamodG 2016-03-08 06:12:44

1
  • 使用新: 调用operator new函数获取动态存储器中,然后调用constuctor功能。
  • 不使用新功能: 不会调用操作符的新功能,只是直接调用构造函数。该堆栈将被直接使用,但不能用于malloc。