首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于异常安全和内存泄漏的几个问题

关于异常安全和内存泄漏的几个问题
EN

Stack Overflow用户
提问于 2013-09-16 13:53:17
回答 1查看 233关注 0票数 0

如果我有一个类A,并且某个主体使用我的代码创建了一个A对象,那么在没有try-catch的情况下调用DoSth(),内存会泄漏吗?在瓦兰的报告中,是否可能丢失并仍可联系到内存泄漏?如果没有,该如何避免呢?而且,A的构造函数是不安全的,对吗?我必须使用智能指针替换原始指针Animal*吗?有一种叫"copy-and-swap",的策略是什么时候使用它?因为新操作符可能会抛出异常,所以当我想在堆上动态分配内存时,我不太明白该做什么。

代码

代码语言:javascript
复制
class A
{
public:
    A(const string& petname, int petage)
        :pet_(new Animal(petname, petage))
    {

    }

    ~A()
    {
        delete pet_;
    }

    void DoSth()
    {
        // do sth...
        throw;
    }

private:
    Animal* pet_;
};

int main(int argc, char const *argv[])
{
    A a("Kitty", 3);
    a.DoSth();
    return 0;
}

瓦莱尔报告

代码语言:javascript
复制
==2799== LEAK SUMMARY:
==2799==    definitely lost: 0 bytes in 0 blocks
==2799==    indirectly lost: 0 bytes in 0 blocks
==2799==      possibly lost: 30 bytes in 1 blocks
==2799==    still reachable: 16 bytes in 1 blocks
==2799==         suppressed: 0 bytes in 0 blocks
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-16 14:13:43

Val差伦的报告显示了潜在的内存泄漏,因为您让异常气泡上升到应用程序级别,从而扼杀了应用程序。然后释放这些资源。

然而,需要注意的是:

1)如果函数有抛出异常的潜力,则应该在该异常到达应用程序级别之前处理它(在该级别上,异常会杀死应用程序--异常的思想是允许您优雅地处理错误)。

2)为什么要在堆中分配Animal?在这个设置中,可以很容易地在堆栈上分配它,在这种情况下,您也不会有一个潜在的泄漏显示在瓦兰。

如果您担心new抛出一个异常(在实践中,这通常只在内存耗尽以进行分配时才发生.因此,通常情况下,您需要在单独的函数中定义初始化(即使是智能指针也不会为您避免这个问题),或者在构造函数中有一个try-catch块,或者不要将Animal放到堆中。

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

https://stackoverflow.com/questions/18829781

复制
相关文章

相似问题

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