声明动态内存语句C ++

时间:2008-11-26 02:39:26

标签: c++ memory dynamic

如果我在堆栈上使用new创建了一些内容,我将其声明为:

object *myObject = new object(contr, params);

有没有办法声明这个:

object *myObject;
myObject = new object(constr, params);

这是对的吗?

5 个答案:

答案 0 :(得分:10)

是的,这是正确的。但是new不会在堆栈上创建东西,而是在堆上创建它们。

要在堆栈上创建对象,您可以这样做:

object myObject(constr, params);

没有其他方法可以在堆栈上创建对象,一旦在堆栈上创建了对象,您就无法在同一个函数中使用相同的名称“重新创建”它。

答案 1 :(得分:3)

正如其他人所说,new会在堆上创建* myObject。为了完整性,我将指出指向对象的指针,称为myObject(注意没有*)确实驻留在堆栈中,就像你声明它一样。由于堆栈变量在离开函数时超出范围,因此必须在返回之前删除对象,或将指针传输到具有更长生命期的另一个变量。在从函数返回之前忽略删除其指针位于堆栈变量中的堆对象是规范内存泄漏情况的一种(尽管远非唯一的情况)

答案 2 :(得分:2)

是的,这是正确的,但它不会在堆栈上分配。相反,它将在堆上分配。如果要在堆栈上分配,请以这种方式声明

object myObject(contr,params);

答案 3 :(得分:1)

如果你想让对象在堆栈上,你需要说

object myObject(contr, params);

答案 4 :(得分:0)

此代码:

object *myObject;
myObject = new object(constr, params);

...是合法的&正确。但请在分配时将myObject初始化为某些内容。记住'myObject'本身不是'object'的实例,而是指针的实例到'object'。所以当你像这样声明这个指针时:

object *myObject;

...你没有初始化它。相反,这样做:

object *myObject = 0;
myObject = new object(constr, params);

...当你删除它时:

delete myObject;
myObject = 0;

人们可能会争辩说你应该把它设置为NULL而不是0,但就语言而言,两者都很好,这主要是风格和你的同事习惯的事情。