【问题标题】:Declaring Dynamic Memory Statements C++声明动态内存语句 C++
【发布时间】:2010-09-24 02:12:22
【问题描述】:

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

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

有没有办法这样声明:

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

这对吗?

【问题讨论】:

    标签: c++ memory dynamic


    【解决方案1】:

    是的,没错。但是 new 不会在堆栈上创建东西,它会在堆上创建它们。

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

    object myObject(constr, params);
    

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

    【讨论】:

    • “没有其他方法可以在堆栈上创建对象” - 严格来说不是这样,但对于初学者来说,这肯定是唯一明智的方法 :-)
    • 更正:您可以在同一个函数中重新创建它,只要它在不同的范围内。 ( void fun() { {int a;} {int a;} } )
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      object myObject(contr,params);
      

      【讨论】:

        【解决方案4】:

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

        object myObject(contr, params);
        

        【讨论】:

          【解决方案5】:

          这段代码:

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

          ...合法且正确。但是请在分配时将 myObject 初始化为某个值。请记住,“myObject”本身不是“对象”的实例,而是指向“对象”的指针 的实例。所以当你像这样声明这个指针时:

          object *myObject;
          

          ...你让它未初始化。相反,请这样做:

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

          ...当你删除它时:

          delete myObject;
          myObject = 0;
          

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

          【讨论】:

            猜你喜欢
            • 2014-05-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多