【问题标题】:Dynamically allocating new object in constructor在构造函数中动态分配新对象
【发布时间】:2013-01-06 10:30:01
【问题描述】:

所以考虑到这个简单的场景:

class A{
public:        
    A(){
        n = new int(10);
    }
    ~A(){
        delete n;
    }
    int* n;
};

int main(){
    A* a = new A();
}

这是否会导致堆损坏(一般问题),因为在我进行新分配时,指针尚未完成分配?

如果是这样,在堆构造函数中使用 std::vector 也是禁止的,对吧?

谢谢。

【问题讨论】:

  • class A() ?你是说class A

标签: c++ heap-memory heap-corruption


【解决方案1】:

您的a 指针已完成分配

新作如下(过于简化)

  • 分配
  • 构造

所以你的情况

  • 分配A
  • 构造一个
    • 分配整数
    • 构造 int - 初始化
  • 完成构造A

这会忽略涉及异常的情况..

【讨论】:

    【解决方案2】:

    没有“堆构造函数”这样的东西,不,你不能通过new在堆上的对象的构造函数中使用内存来破坏堆。 new A 的内存在调用A::A() 时已完全分配。您所做的既正确又非常普遍。您的构造函数需要从不关心正在构造的对象是分配在堆栈还是堆上。否则,指针和类将毫无用处。

    【讨论】:

      【解决方案3】:

      如果 "new" 抛出异常,则不会分配对象(请注意在 "new" 之前进行的任何分配都需要解除分配,否则您将有内存泄漏)..

      异常被认为是错误系统,因为构造函数不能返回错误代码。

      myclass::myclass()
      {
          param1 = new type1(); //successfull
          try
          {
              param2= new type2(); //may fail
          }
          (...)
          {
              delete param1; //need to deallocate
          }
      }
      

      这有点矫枉过正,我更喜欢在构造函数中完全没有异常,有些人用构造函数制作整个框架而不是抛出异常..

      无论如何,分配器中的任何其他错误都可能导致:

      分段错误(访问超出范围的值)

      堆损坏(覆盖内存范围内但技术上不属于对象的数据)

      无限循环(你需要从外部中止程序,否则它永远不会退出分配器)。

      当然,这些是您使用普通代码也可能遇到的主要问题。然而,默认分配器不会产生任何问题,至少可以抛出“内存不足”异常。如果你没有足够的内存。

      【讨论】:

      • True:但与这个问题无关。还有一些你可能想要纠正的语法错误。
      • 这是相关的,因为在构造函数中调用了“new”,并处理了可能的错误。标题并没有描述整个问题,但问题确实如此。这里的所有答案都有助于整个问题。当然,是的,一些语法错误(语法:-)。
      猜你喜欢
      • 1970-01-01
      • 2018-10-07
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 2014-01-05
      相关资源
      最近更新 更多