代码之家  ›  专栏  ›  技术社区  ›  ckv

用智能指针替换现有的原始指针

  •  1
  • ckv  · 技术社区  · 14 年前

    注意:这可能听起来很愚蠢。 我有一个应用程序,它使用原始指针,并且在应用程序中有很多内存泄漏。

    现在我的问题是用智能指针替换现有的原始指针有多容易。

    再进一步解释一下,这个应用程序是一个遗留应用程序,存在非常直接的内存泄漏,内存将被分配,并且不会在同一个函数中释放。

    我用DevPartner做了一个内存分析,发现了很多地方。Valgrind比Devpartner好。

    5 回复  |  直到 14 年前
        1
  •  3
  •   bshields    14 年前

    使用智能指针无疑是清理应用程序的一个良好开端,但它们并不是万能的。大量的内存泄漏可能只是一个设计良好的程序中的粗心大意,但更可能的是您有重大的设计问题,内存泄漏就是一个症状。当您切换到智能指针时,您仍然需要做出诸如“谁拥有此对象”、“此对象的所有权是否在多个客户端之间共享”和“此对象的预期寿命是多少”之类的设计选择,以便为给定场景选择正确的智能指针实现。但这将是一个很好的开始,因为为不同的情况选择合适风格的智能指针的过程将迫使您考虑这些问题,并可能会改进您的设计。

        2
  •  2
  •   Gangadhar    14 年前

    根据我的经验,大多数内存泄漏都遵循一定的模式(开发人员a遗漏了一些东西,开发人员B复制了这些代码,同时也带来了问题)。因此,在考虑使用智能指针之前,使用工具可以先解决内存泄漏问题。

    如果你开始开发这个应用程序-从使用智能指针开始。它们将为您节省大量的时间和精力。

        3
  •  2
  •   David Thornley    14 年前

    auto_ptr ,可能处理得很好(注: 自动\u ptr 是第一个ISO标准的一部分,在下一个标准中被弃用,所以很难给出关于使用什么范围的指针的建议。请参阅编译器和库文档以了解它们支持什么。)

    shared_ptr 但是你得小心点。分配给 当您创建对象时,请确保每使用一个其他指针都是 . 如果例程A、B和C通过 共享\u ptr ,并且你没有改变D,那么当例程A,B,C结束时,它就消失了,不管D需要什么。

    有一件事你想避免 共享\u ptr 共享\u ptr 共享\u ptr 到K,K有一个 共享\u ptr weak_ptr 在循环中,或者自己删除循环中的一个元素,或者只是活在泄漏中。

    另一个要考虑的是替换 vector 以及用于动态分配的数组和其他动态分配的数据结构的类似容器。这为您提供了很多免费的内存管理,尽管您仍然可以泄漏内存。如果一个向量变大,然后变小,它将不会释放额外的内存。如果你真的需要回收内存,通常的做法是 swap 曾经很大的向量有一个自身的副本。

    共享\u ptr 将每个数组 矢量 ,但明智地使用这些工具将带来更大的好处。

        4
  •  1
  •   gtrak    14 年前

    视情况而定,如果对对象的硬引用阻止垃圾回收器释放它,垃圾回收的程序仍可能存在内存泄漏。如果您想找出内存泄漏发生在哪里,请使用探查器或编写单元测试和模拟对象。

    Edit:要获得智能指针的好处,还必须引入或实现自己的垃圾收集器,因为它不是语言特性。

    编辑2:智能指针显然实现了引用计数,这是一种垃圾收集策略。

        5
  •  0
  •   jyoung    14 年前