2

所以给定这个简单的场景:

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

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

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

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

谢谢你。

4

3 回答 3

2

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

于 2013-01-23T02:10:24.513 回答
2

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

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

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

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

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

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

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

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

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

于 2013-01-23T02:14:13.377 回答
2

您的a指针已完成分配

新作品如下(过于简化)

  • 分配
  • 构造

所以在你的情况下

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

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

于 2013-01-23T02:15:51.473 回答