引发异常时避免内存泄漏的方法

chihyang

这是C ++ Primer第18章的练习:

void exercise(int *b, int *e)
{
    vector<int> v(b, e);
    int *p = new int[v.size()];
    ifstream in("ints");
    // exception occurs here
}

上面的代码将导致内存泄漏,因为p发生异常时,我们直接管理的内存(即)不会自动释放。

练习18.3:

如果引发异常,有两种方法可以使先前的代码正常工作。描述并实施它们。

我知道我们可以使用智能指针来避免这种陷阱:

void exercise(int *b, int *e)
{
    vector<int> v(b, e);
    unique_ptr<int[]> p(new int[v.size()]);
    ifstream in("ints");
    // exception occurs here
}

或者:

void exercise(int *b, int *e)
{
    vector<int> v(b, e);
    shared_ptr<int> p(new int[v.size()], [](int *p){ delete[] p; });
    ifstream in("ints");
    // exception occurs here
}

我不确定这些是否TWO可行。毕竟,它们实际上是相同的。所以我想到了另一种方式:

void exercise(int *b, int *e)
{
    vector<int> v(b, e);
    int *p = new int[v.size()];
    ifstream in("ints");
    // exception occurs here
    if(!in)
        throw p;
}

// caller
try {
    exercise(b, e);
} catch (int *err) {
    delete[] err; // initialize err with b and delete e.
}

如果发生异常,则抛出p以初始化另一个指针并删除该指针。我知道这不是一个完美的解决方案,因为可能会发生其他异常,因此我什至没有机会抛出异常p但是我想不到更好的了。您能帮忙找到第二种方法吗?

约翰·兹温克

您可以显式捕获并重新引发异常:

void exercise(int *b, int *e)
{
    vector<int> v(b, e);
    int *p = new int[v.size()];
    try {
        ifstream in("ints");
        // exception occurs here
    } catch (...) {
        delete[] p;
        throw;
    }
    delete[] p;
}

当然,如果您有多个资源要释放,那么效果就不太好,因为您可能最终会嵌套嵌套的try / catch块。更不用说您有两个delete1 new因此,RAII是首选。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当此方法引发异常时,会导致内存泄漏吗?

来自分类Dev

当此方法引发异常时,会导致内存泄漏吗?

来自分类Dev

使用 arraylist 时如何避免内存泄漏?

来自分类Dev

结合使用多处理和请求时,是否有更好的方法来避免内存泄漏?

来自分类Dev

避免内存泄漏

来自分类Dev

FLEX:避免内存泄漏

来自分类Dev

从映射中删除对象指针时避免内存泄漏

来自分类Dev

从映射中删除对象指针时避免内存泄漏

来自分类Dev

在调用引发异常的方法时,如何避免在try catch块中出现伪返回?

来自分类Dev

在调用引发异常的方法时,如何避免在try catch块中出现伪返回?

来自分类Dev

使用 newInsance() 方法时内存泄漏

来自分类Dev

队列中异常的内存泄漏-代码在退出时挂起

来自分类Dev

避免SetFocus引发异常

来自分类Dev

调试Matlab避免内存泄漏

来自分类Dev

如何避免jQuery的内存泄漏?

来自分类Dev

如何避免这种内存泄漏?

来自分类Dev

嵌套属性保存失败时如何避免引发异常

来自分类Dev

使用C ++异常的内存泄漏

来自分类Dev

测试引发异常的方法时验证行为

来自分类Dev

OracleBulkCopy内存泄漏(内存不足异常)

来自分类Dev

内存使用率异常(内存泄漏?)

来自分类Dev

调用实例的描述方法时迅速发生内存泄漏

来自分类Dev

使用WriteableBitmap.AddDirtyRect()时内存泄漏的解决方法

来自分类Dev

在活动之间进行切换时是否需要添加某些内容以避免内存泄漏?

来自分类Dev

在活动之间进行切换时,是否需要添加某些内容以避免内存泄漏?

来自分类Dev

意图:通过使用 getApplicationContext() 在实例化意图时避免内存泄漏?

来自分类Dev

nodejs setMaxListeners避免内存泄漏检测

来自分类Dev

使用jQuery / .data()避免内存泄漏

来自分类Dev

避免Windows Phone 8中的内存泄漏

Related 相关文章

  1. 1

    当此方法引发异常时,会导致内存泄漏吗?

  2. 2

    当此方法引发异常时,会导致内存泄漏吗?

  3. 3

    使用 arraylist 时如何避免内存泄漏?

  4. 4

    结合使用多处理和请求时,是否有更好的方法来避免内存泄漏?

  5. 5

    避免内存泄漏

  6. 6

    FLEX:避免内存泄漏

  7. 7

    从映射中删除对象指针时避免内存泄漏

  8. 8

    从映射中删除对象指针时避免内存泄漏

  9. 9

    在调用引发异常的方法时,如何避免在try catch块中出现伪返回?

  10. 10

    在调用引发异常的方法时,如何避免在try catch块中出现伪返回?

  11. 11

    使用 newInsance() 方法时内存泄漏

  12. 12

    队列中异常的内存泄漏-代码在退出时挂起

  13. 13

    避免SetFocus引发异常

  14. 14

    调试Matlab避免内存泄漏

  15. 15

    如何避免jQuery的内存泄漏?

  16. 16

    如何避免这种内存泄漏?

  17. 17

    嵌套属性保存失败时如何避免引发异常

  18. 18

    使用C ++异常的内存泄漏

  19. 19

    测试引发异常的方法时验证行为

  20. 20

    OracleBulkCopy内存泄漏(内存不足异常)

  21. 21

    内存使用率异常(内存泄漏?)

  22. 22

    调用实例的描述方法时迅速发生内存泄漏

  23. 23

    使用WriteableBitmap.AddDirtyRect()时内存泄漏的解决方法

  24. 24

    在活动之间进行切换时是否需要添加某些内容以避免内存泄漏?

  25. 25

    在活动之间进行切换时,是否需要添加某些内容以避免内存泄漏?

  26. 26

    意图:通过使用 getApplicationContext() 在实例化意图时避免内存泄漏?

  27. 27

    nodejs setMaxListeners避免内存泄漏检测

  28. 28

    使用jQuery / .data()避免内存泄漏

  29. 29

    避免Windows Phone 8中的内存泄漏

热门标签

归档