在构造函数中动态分配新对象

时间:2013-01-23 02:06:51

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

所以给出了这个简单的场景:

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

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

这会导致堆损坏(一般是问题),因为一个指针还没有完成分配,而我正在进行新的分配吗?

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

谢谢。

3 个答案:

答案 0 :(得分:2)

您的a指针已完成分配

新作品如下(过度简化)

  • 分配
  • 构建

所以在你的情况下

  • 分配A
  • 构建A.
    • 分配i​​nt
    • 构造int - 初始化
  • 完成构建A

这忽略了涉及例外的案件。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果“new”抛出一个异常,则该对象未被分配(注意任何分配在“new”之前需要被释放,否则你将有一个内存浸出)..

由于构造函数无法返回错误代码,因此认为异常被用作错误系统。

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

这有点矫枉过正,我宁愿在构造函数中没有例外,有些人使用构造函数制作整个frameorks而不是抛出异常..

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

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

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

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

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