如果我有一个名为Object的类,那么创建一个实例之间的区别是什么:
Object var;
和
Object* var = new Object();
答案 0 :(得分:17)
在这里你要在堆栈上创建var:
Object var;
所以在上面,var
是实际的对象。
这里你要在堆上创建var(也称为动态分配):
Object* var = new Object()
在堆上创建对象时,必须在使用它时调用delete
。另外var
实际上是一个指针,它保存Object
类型对象的内存地址。在内存地址存在实际对象。
有关详细信息:See my answer here on what and where are the stack and heap。
答案 1 :(得分:11)
此:
Object var();
是函数声明。它声明了一个不带参数的函数,并返回Object
。你的意思是:
Object var;
正如其他人所指出的那样,它创建了一个具有自动存储持续时间的变量(a.k.a,在堆栈上)。
答案 2 :(得分:5)
Object var();
声明返回Object
的函数。要创建一个自动对象(即在堆栈上):
Object var; // You shouldn't write the parenthesis.
虽然:
Object* var = new Object();
是动态分配的Object
。
答案 3 :(得分:3)
Object var;
创建一个有效的Object,直到当前范围结束,通常直到'}'
Object* varp = new Object();
创建一个指向新创建的Object。指针(varp)在作用域的en d之前有效,但是对象本身一直存在,直到在指针上调用delete。
你应该总是喜欢第一个版本,除非有理由做第二个版本。第二个版本需要更多内存(你需要空间用于指针和对象),需要更多时间(系统需要在堆上分配内存),你需要确保调用delete以释放内存完成它。
答案 4 :(得分:1)
Object var();
在堆栈上分配对象,因此您不必解除分配
Object* var = new Object();
在堆上分配对象