博客
关于我
条款13:以对象管理资源
阅读量:321 次
发布时间:2019-03-04

本文共 1087 字,大约阅读时间需要 3 分钟。

常见的需要管理的资源有哪些?

在软件开发过程中,资源管理是确保程序稳定运行的重要环节。资源包括内存、文件描述符、互斥锁、字体和画笔、数据库连接、网络套接字等。这些资源在程序运行过程中需要被合理分配和释放,以防止内存泄漏或资源竞争。

传统管理资源的方法的缺点

传统的做法是通过手动操作管理资源。例如,使用工厂函数创建对象后,开发者需要在适当的时候手动释放内存。这种方法存在以下问题:

  • 返回操作干扰:如果在使用资源时函数中存在return语句,后续的释放语句将无法执行。
  • 异常处理不足:在资源释放之前发生异常或错误,资源也无法得到正确释放。
  • 循环体内释放:在循环体内释放资源,如果遇到continue或break,后续的释放语句将被跳过。
  • 这种手动管理方式容易导致资源泄漏,影响程序性能和稳定性。

    解决资源泄漏问题的方案

    为了确保资源在使用后能被自动释放,可以采用对象管理的方式。将资源包含在对象中,利用对象的析构函数自动释放资源。这种方法的核心思想是“资源获取时机即为资源管理对象创建时机”。

    标准库中的应用实例:auto_ptr

    1. 功能:自动释放堆内存

    auto_ptr 是一种智能指针,用于管理动态内存。它自动调用析构函数释放指向的内存,避免了手动管理的复杂性。

    2. 实现原理

    auto_ptr 的关键思想是:

    • 资源获取时机:在使用资源时,立即将资源放入管理对象中。
    • 资源释放机制:管理对象的析构函数负责释放资源。

    这种设计确保了资源在使用后能被自动释放,即使在异常情况下也能保证资源的安全性。

    3. 缺点

    auto_ptr 的唯一性导致其不能同时被多个指针管理,这在某些场景下可能带来不便。例如,STL容器等需要复制行为的对象不适合使用 auto_ptr

    标准库中的应用实例:shared_ptr

    1. 基本原理

    shared_ptr 是一种引用计数型的智能指针。它通过内部计数器跟踪指针的使用次数,只有当没有指针指向同一对象时,才会释放内存。

    2. 缺点

    shared_ptr 无法处理循环引用问题(例如A指向B,B指向A),在这种情况下两者都无法被释放。

    使用智能指针的注意事项

    • 动态分配数组注意事项:智能指针不能管理动态分配的数组内存,应使用 vectorstring 等容器来处理。
    • 标准库的局限性auto_ptrshared_ptr 都无法处理环状引用问题。

    结语

    资源管理是软件开发中的核心环节。通过采用智能指针等对象管理方式,可以有效避免资源泄漏问题。对于具体需求,可以根据实际情况选择合适的资源管理工具或手动实现自定义的资源管理类。

    转载地址:http://ifgq.baihongyu.com/

    你可能感兴趣的文章
    php aes sha1解密,PHP AES加密/解密
    查看>>
    php CI框架单个file表单多文件上传例子
    查看>>
    reflow和repaint引发的性能问题
    查看>>
    php csv 导出
    查看>>
    php curl 实例+详解
    查看>>
    php curl_init函数用法(http://blog.sina.com.cn/s/blog_640738130100tsig.html)
    查看>>
    php curl_multi批量发送http请求
    查看>>
    php echo 输出 锘?... 乱码问题
    查看>>
    ReferenceQueue的使用
    查看>>
    php flush()刷新不能输出缓冲的原因分析
    查看>>
    Referenced classpath provider does not exist: org.maven.ide.eclipse.launchconfig
    查看>>
    Refactoring-Imporving the Design of Exsiting Code — 代码的坏味道
    查看>>
    PHP imap 远程命令执行漏洞复现(CVE-2018-19518)
    查看>>
    php include和require
    查看>>
    ref 和out 区别
    查看>>
    php JS 导出表格特殊处理
    查看>>
    php json dom解析
    查看>>
    ReentrantReadWriteLock读写锁解析
    查看>>
    php laravel实现依赖注入原理(反射机制)
    查看>>
    php laravel请求处理管道(装饰者模式)
    查看>>