std :: shared_ptr:未调用自定义删除器

约翰·H

我正在研究C ++ Primer,第5版,作者提供了一个示例,该示例使用shared_ptrs管理来自较旧库的资源可能会泄漏内存,以防止它们这样做。我决定创建一个测试以查看其工作方式,但是在引发异常并且(故意)未捕获到异常之后,我的自定义删除程序不会被调用:

#include <iostream>
#include <memory>
#include <string>

struct Connection {};

Connection* Connect(std::string host)
{
    std::cout << "Connecting to " << host << std::endl;
    return new Connection;
}

void Disconnect(Connection* connection)
{
    std::cout << "Disconnected" << std::endl;
    delete connection;
}

void EndConnection(Connection* connection)
{
    std::cerr << "Calling disconnect." << std::endl << std::flush;
    Disconnect(connection);
}

void AttemptLeak()
{
    Connection* c = Connect("www.google.co.uk");
    std::shared_ptr<Connection> connection(c, EndConnection);

    // Intentionally let the exception bubble up.
    throw;
}

int main()
{
    AttemptLeak();

    return 0;
}

它产生以下输出:

连接到www.google.co.uk

我的理解是,当一个函数退出时,无论是正常退出还是由于异常退出,局部变量都将被销毁。在这种情况下,这意味着退出connection时被销毁AttemptLeaks(),调用其析构函数,然后调用EndConnection()还要注意,我正在使用和刷新cerr,但是也没有给出任何输出。

我的榜样或我的理解有问题吗?

编辑:虽然我已经有了这个问题的答案,但是对于将来偶然发现此问题的其他任何人,我的问题是我对throw工作原理的理解尽管下面的答案正确说明了如何使用它,但我认为最好明确表明我(错误地)试图使用它来“生成”未处理的异常,以测试我的代码。

彼得·G

Barethrow旨在用于catch块内部以重新抛出捕获的异常。如果在catch块外使用它,terminate()将被调用,并且程序立即结束。看看“抛出”是什么 外面有挡水板吗?

如果删除throw-statement,shared_ptr connection将超出范围,应调用删除程序。如果您对使用shared_ptr的异常安全性有任何疑问(我不会;),可以通过将更throw改为来在此处显式抛出异常throw 1

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有std :: function的std :: shared_ptr作为自定义删除器和分配器

来自分类Dev

“<function-style-cast>”:在使用自定义删除器创建 shared_ptr 时无法从“初始化列表”转换为“std::shared_ptr<SDL_Window>”

来自分类Dev

自定义删除器,用于std :: shared_ptrs

来自分类Dev

使用std :: function对象将自定义删除器传递给std :: unique_ptr

来自分类Dev

使用std :: function对象将自定义删除器传递给std :: unique_ptr

来自分类Dev

std :: shared_ptr删除者类型

来自分类Dev

Shared_ptr自定义删除器

来自分类Dev

std :: unique_ptr <T []>和自定义分配器删除器

来自分类Dev

std :: unique_ptr使用带有很少参数的自定义删除器

来自分类Dev

使用typedef为std :: unique_ptr指定自定义默认删除器

来自分类Dev

std :: unique_ptr,自定义删除器和类型更改

来自分类Dev

如何制作将函数包装在noexcept可检测的可调用对象中的类模板,以用作std :: unique_ptr自定义删除器?

来自分类Dev

使用std :: move与std :: shared_ptr

来自分类Dev

QVariant与std :: shared_ptr

来自分类Dev

QVariant与std :: shared_ptr

来自分类Dev

为什么std :: shared_ptr不接受我的删除器功能对象?

来自分类Dev

如何将自定义删除器与std :: unique_ptr成员一起使用?

来自分类Dev

我可以使用自定义删除器简洁地声明std :: unique_ptr吗?

来自分类Dev

删除std :: shared_ptr而不破坏托管对象?

来自分类Dev

将具有自定义删除器的unique_ptr移到shared_ptr

来自分类Dev

std :: shared_ptr与std :: make_shared:意外的缓存未命中和分支预测

来自分类Dev

shared_ptr<> 的自定义删除器给出“无上下文错误”

来自分类Dev

拥有std :: make_shared的std :: shared_ptr

来自分类Dev

自定义删除程序以通过std :: unique_ptr释放2D数组

来自分类Dev

带有lambda自定义删除程序的std :: unique_ptr无法编译

来自分类Dev

使用std :: shared_ptr的std :: map调用const重载函数

来自分类Dev

我可以定义从std :: function到std :: shared_ptr <MyClass>的隐式转换吗?

来自分类Dev

我可以定义从std :: function到std :: shared_ptr <MyClass>的隐式转换吗?

来自分类Dev

std :: shared_ptr和继承

Related 相关文章

  1. 1

    具有std :: function的std :: shared_ptr作为自定义删除器和分配器

  2. 2

    “<function-style-cast>”:在使用自定义删除器创建 shared_ptr 时无法从“初始化列表”转换为“std::shared_ptr<SDL_Window>”

  3. 3

    自定义删除器,用于std :: shared_ptrs

  4. 4

    使用std :: function对象将自定义删除器传递给std :: unique_ptr

  5. 5

    使用std :: function对象将自定义删除器传递给std :: unique_ptr

  6. 6

    std :: shared_ptr删除者类型

  7. 7

    Shared_ptr自定义删除器

  8. 8

    std :: unique_ptr <T []>和自定义分配器删除器

  9. 9

    std :: unique_ptr使用带有很少参数的自定义删除器

  10. 10

    使用typedef为std :: unique_ptr指定自定义默认删除器

  11. 11

    std :: unique_ptr,自定义删除器和类型更改

  12. 12

    如何制作将函数包装在noexcept可检测的可调用对象中的类模板,以用作std :: unique_ptr自定义删除器?

  13. 13

    使用std :: move与std :: shared_ptr

  14. 14

    QVariant与std :: shared_ptr

  15. 15

    QVariant与std :: shared_ptr

  16. 16

    为什么std :: shared_ptr不接受我的删除器功能对象?

  17. 17

    如何将自定义删除器与std :: unique_ptr成员一起使用?

  18. 18

    我可以使用自定义删除器简洁地声明std :: unique_ptr吗?

  19. 19

    删除std :: shared_ptr而不破坏托管对象?

  20. 20

    将具有自定义删除器的unique_ptr移到shared_ptr

  21. 21

    std :: shared_ptr与std :: make_shared:意外的缓存未命中和分支预测

  22. 22

    shared_ptr<> 的自定义删除器给出“无上下文错误”

  23. 23

    拥有std :: make_shared的std :: shared_ptr

  24. 24

    自定义删除程序以通过std :: unique_ptr释放2D数组

  25. 25

    带有lambda自定义删除程序的std :: unique_ptr无法编译

  26. 26

    使用std :: shared_ptr的std :: map调用const重载函数

  27. 27

    我可以定义从std :: function到std :: shared_ptr <MyClass>的隐式转换吗?

  28. 28

    我可以定义从std :: function到std :: shared_ptr <MyClass>的隐式转换吗?

  29. 29

    std :: shared_ptr和继承

热门标签

归档