C++ 声明动态内存语句C++;

C++ 声明动态内存语句C++;,c++,memory,dynamic,C++,Memory,Dynamic,嗨,如果我正在使用new在堆栈上创建某些内容,我会这样声明: object *myObject = new object(contr, params); 是否有一种方式来声明这一点,例如: object *myObject; myObject = new object(constr, params); 这是正确的吗?是的,这是正确的。但是new不会在堆栈上创建东西,而是在堆上创建它们 要在堆栈上创建对象,请执行以下操作: object myObject(constr, params); 没

嗨,如果我正在使用new在堆栈上创建某些内容,我会这样声明:

object *myObject = new object(contr, params);
是否有一种方式来声明这一点,例如:

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

这是正确的吗?

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

要在堆栈上创建对象,请执行以下操作:

object myObject(constr, params);

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

是的,这是正确的,但不会在堆栈上分配。相反,它将在堆上进行分配。如果要在堆栈上进行分配,请这样声明

object myObject(contr,params);

如果希望对象位于堆栈上,则需要

object myObject(contr, params);

正如其他人所说,new将在堆上创建*myObject。为了完整起见,我将指出,指向对象的指针,称为myObject(注意,没有*),确实以您声明它的方式驻留在堆栈上。由于堆栈变量在离开函数时超出范围,因此必须在返回之前删除该对象,或者将指针转移到另一个具有较长生命周期的变量。在从函数返回之前,忽略删除指针位于堆栈变量中的堆对象是一种典型的内存泄漏场景(虽然远非唯一的场景)

此代码:

object *myObject;
myObject = new object(constr, params);
…合法且正确。但请在分配对象时将其初始化为某个对象。记住,“myObject”本身不是“object”的实例,而是指向“object”的指针的实例。因此,当您像这样声明此指针时:

object *myObject;
…您将使其处于未初始化状态。相反,请执行以下操作:

object *myObject = 0;
myObject = new object(constr, params);
…删除时:

delete myObject;
myObject = 0;

人们可能会争论您应该将其设置为NULL而不是0,但就语言而言,两者都可以,这主要是风格和您的同事习惯的问题。

“没有其他方法在堆栈上创建对象”-严格来说不是真的,但对于初学者来说,这当然是唯一合理的方法:-)更正:您可以在相同的函数中重新创建它,只要它在不同的范围内。(void fun(){{int a;}{int a;}})