首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个特定的例子会产生内存泄漏吗?

这个特定的例子会产生内存泄漏吗?
EN

Stack Overflow用户
提问于 2013-03-12 14:11:57
回答 4查看 82关注 0票数 1
代码语言:javascript
复制
class A // blah blah generic abstracty whatever
{
  public:
  A();
  ~A();
};

class B
{
  public:
  B();
  ~B();

  private:
  A* a[8];
};

B::B()
{
  for(int x = 0; x < 8; x++)
  {
    a[x] = new A;
  }
}

B::~B()
{
  for(int x = 0; x < 8; x++)
  {
    delete a[x];
  }
}

我只是好奇上面的代码会不会自行泄露。有没有什么情况下它会泄漏(除了我没有正确调用delete )?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-12 14:14:40

,如果new抛出构造函数,这是可能的。

析构函数将不会运行,任何已经发生的分配都不会被释放。

更具体地说:如果在构造函数中发生异常之前动态分配了任何内存,则会发生内存泄漏,因为对象的析构函数将不会运行。

一个简单的插图:

代码语言:javascript
复制
class Leaks
{
private:

    data* d;

public:

    Leaks()
    {
        data = new int;
        throw 1;
    }

    ~Leaks()
    {
        delete data;
    }

};

这是一个有缺陷的设计。data总是会在这里泄露。这事一点儿办法都没有。(唯一不会泄漏数据的情况是new失败。)

因为new本身可以抛出,所以您的示例代码能够在一个或多个分配后抛出,从而导致泄漏。

有三种方法可以解决这个问题:

  • 不分配内存(在这种情况下,你可以简单地使用一个向量,但显然有时没有办法避免使用动态allocations)
  • Make来确保你的构造函数在任何内存分配之后都不会抛出,或者在抛出之前抛出来清理内存。这将生成一些非常糟糕的代码,不过在constructors
  • Use智能指针

中,除了最微不足道的部分之外,所有代码都是如此

票数 9
EN

Stack Overflow用户

发布于 2013-03-12 14:14:23

没有泄漏。这段代码很好--没有泄漏。

票数 1
EN

Stack Overflow用户

发布于 2013-03-12 14:15:17

看不到任何泄漏或潜在的泄漏。唯一令人讨厌的地方是硬编码的数组大小。如果要将其更改为动态的,则可能需要查看delete[]操作符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15354502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档