使用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);
…在本地范围内分配一个Time
types的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; }