有关异常安全性和内存泄漏的一些问题

吉奇奇

如果我有一个类,A并且某些机构使用我的代码创建的对象A,则在DoSth()不使用的情况下调用try-catch,是否会导致内存泄漏?valgrind的报告中可能丢失并仍可访问的消息是否表示内存泄漏?如果没有,如何避免它们?而且,的构造函数A不安全吗?我必须在这里使用智能指针替换原始指针Animal*吗?还有一种称为“复制和交换”的策略,何时使用?由于new运算符可能会引发异常,因此当我要在堆上动态分配内存时,我几乎不感到困惑。

代码

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;
}

瓦尔格朗德报告

==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
扎克·豪兰(Zac Howland)

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

但是,需要注意一些事项:

1)如果某个函数有可能引发异常,则应在达到应用程序级别之前处理该异常(在该级别,该异常将杀死您的应用程序-异常的想法是允许您优雅地处理错误)。

2)为什么要Animal在堆上分配在此设置中,可以很容易地将其分配到堆栈上,在这种情况下,Valgrind中也不会显示潜在的泄漏。

如果您担心new引发异常(实际上,这种情况通常仅在内存不足以进行分配时才会发生……所以不是很常见),则需要在单独的函数中定义初始化(即使智能指针也不会)避免为您解决该问题),或者在构造函数中有一个try-catch块,或者不要放在Animal堆上。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有关“ angularJS与Plupload一起使用的一些问题

来自分类Dev

有关使用MongoDB Java驱动程序的一些问题

来自分类Dev

有关何时使用片段和活动的一些问题

来自分类Dev

有关沙发床复制品细节的一些问题

来自分类Dev

有关Objective-C的一些问题

来自分类Dev

有关SymmetricDS Embedded的一些问题

来自分类Dev

有关克隆/复制TR的一些问题

来自分类Dev

有关OpenGL透明度的一些问题

来自分类Dev

有关表格,css中的位置的一些问题

来自分类Dev

使用jfugue转换密钥-有关Jfugue的一些问题

来自分类Dev

有关带有Openlayers3的WFS-T的一些问题

来自分类Dev

有关angular2提供程序的一些问题

来自分类Dev

Scrapy-有关刮论坛的一些问题

来自分类Dev

有关C语言中内存分配的一些问题

来自分类Dev

有关Progress-4GL中事件处理的一些问题

来自分类Dev

有关Python功能及其工作方式的一些问题

来自分类Dev

有关班级的一些问题

来自分类Dev

C ++ STL容器-有关类型的一些问题?

来自分类Dev

有关“ angularJS与Plupload一起使用的一些问题

来自分类Dev

有关资源的一些问题

来自分类Dev

有关SSH密钥身份验证的一些问题

来自分类Dev

有关原型和数组的一些问题

来自分类Dev

有关Angularjs指令的一些问题

来自分类Dev

有关解析multiplt Spring View解析器的一些问题

来自分类Dev

有关沙发床复制品细节的一些问题

来自分类Dev

有关指向班级成员的指针的一些问题

来自分类Dev

有关OpenGL透明性的一些问题

来自分类Dev

有关轮询的一些问题

来自分类Dev

有关光缆的一些问题