【问题标题】:what will happen to the alloacted memory in a constructor if I throw exception from constructor? [duplicate]如果我从构造函数中抛出异常,构造函数中分配的内存会发生什么? [复制]
【发布时间】:2014-09-22 19:00:34
【问题描述】:

如果我在构造函数中使用 new 为指针分配一些内存,并且如果我在分配内存表单构造函数后抛出异常,内存将被回收还是内存泄漏?

class A
{
    public:
        A()
        {
            p = new int(4);
            throw 1;
        }

        ~A()
        {
            delete p;
        }

    private:
        int *p;
};

【问题讨论】:

  • 如果你这样做没有抛出异常,你认为会发生什么?你有一个 new 没有一个 delete - 无论如何都不好。
  • 正如写的那样,这是一个等待中的内存泄漏不管是否抛出异常。为了解决您的问题,std::vector<int> p;,然后是构造函数的初始化程序上的p(4)。然后扔你想要的。 Pointers should not own resources.
  • 好的,约瑟夫。我添加了析构函数
  • @kadina 析构函数无助于抛出异常。
  • @πάνταῥεῖ:是的。我知道。但是约瑟夫想添加析构函数:)

标签: c++


【解决方案1】:

内存不会被回收。即使你正确地有一个析构函数(和复制/赋值运算符),它仍然会泄漏内存。

任何完全构造的子对象都将在抛出后被破坏。在这种情况下,p 将被破坏,不要与p 指向的内存空闲相混淆:它们是两个非常不同的东西,实际上内存会被泄漏。

【讨论】:

  • 谢谢马克。我认为以下是规则
  • 1) 构造对象的析构函数不会被调用。 2) 将调用该对象类中包含的成员对象的析构函数 3) 将释放正在构造的对象的内存。
  • 但在这种情况下 p 也是成员变量。
  • 谢谢马克。我现在明白了。
猜你喜欢
  • 1970-01-01
  • 2017-04-03
  • 2019-08-12
  • 2014-04-03
  • 2014-08-12
  • 1970-01-01
  • 2011-11-04
  • 2011-05-20
相关资源
最近更新 更多