动态地分配在构造新对象(Dynamically allocating new object in c

2019-08-07 21:38发布

因此,考虑这个简单的场景:

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

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

可这个原因堆损坏(一般问题),因为指针没有完成分配,而我正在做新的分配?

如果是这样,使用堆构造内的std ::载体,也是禁止的,对不对?

谢谢。

Answer 1:

你的a指针已完成分配

新作如下(简单化)

  • 分配
  • 构造

所以你的情况

  • 分配
  • 构建一个
    • 分配INT
    • 构建INT - 初始化
  • 完成构建

这忽略涉及例外情况..



Answer 2:

没有所谓的“堆构造”没有这样的事,没有,你不能破坏堆通过new上堆对象的构造函数中ING内存。 对于存储new A在时间全部分配给A::A()被调用。 你在做什么是正确和非常普遍的。 你需要的构造从来没有被构造的对象是否在栈或堆上分配有关。 否则,指针和类将是相当无用的。



Answer 3:

如果“新”抛出一个异常,那么对象未分配(注意之前的“新”的任何分配需要在其他释放你就会有一个内存浸出)..

例外情况鑫卡特用作误差系统,因为构造函数不能返回一个错误代码。

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

这是一个有点矫枉过正,我更喜欢有在所有构造函数没有例外,有些人让整个frameorks与构造比可以抛出异常..

反正在分配任何其他错误可能导致:

段故障(访问外的范围值)

堆损坏(覆写在存储器范围的数据,但没有被tecnically资bythe对象)

无限循环(您需要外部中止程序,否则将永远退出分配器)。

这些都是电源问题,你也可以有,当然正常的代码。 默认分配但不会给予任何问题,至少可以抛出一个“内存不足”异常。 如果你没有足够的RAM。



文章来源: Dynamically allocating new object in constructor