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