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); |
...在本地范围内分配一个
相比之下:
1 | Time* t = new Time(12, 0, 0); |
...通过调用
另一个明显的区别是访问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; } |