【问题标题】:Can someone explain smart pointers in plain English?有人可以用简单的英语解释智能指针吗?
【发布时间】:2011-02-15 14:56:41
【问题描述】:

今天有人问我关于 C++ 中的智能指针,我找不到任何有用的信息。

请,有人可以告诉: 什么是智能指针? 你什么时候需要它? 你有任何智能指针真正有用的例子吗?

谢谢!

【问题讨论】:

标签: c++ smart-pointers


【解决方案1】:

智能指针主要帮助您:

  • 在抛出异常时避免泄漏。当抛出异常时,您不希望在 try 块中先前分配的任何对象被泄漏。通过将它们包装在智能指针中,当退出 try 块时,智能指针将被销毁,这些对象将被正确销毁。
  • 通过对对象的引用计数所有者来管理生命周期(即,最后一个销毁引用特定对象的智能指针实际上会释放该对象)。这在松散耦合的情况下特别有用,因为对象的用户彼此不了解,所以不清楚何时应该销毁对象。

智能指针有用的一个很好的例子:

指向对象的指针向量。经过 使其成为共享指针的向量, 例如,对象将 自动被释放时 矢量被破坏和/或对象是 删除。这可以自动化对象生命周期管理,并帮助容器用户避免内存泄漏。

【讨论】:

  • 谢谢你,你能解释更多关于使用智能指针来处理异常吗?在这种情况下如何使用它?
  • 请注意,除了引用计数之外,还有其他技术,例如在双向链表中链接智能指针。不过不太实用。
  • @VextoR,添加了有关它们如何帮助处理异常的更多详细信息
【解决方案2】:

摘自 Boost Smart Pointers (smart_ptr) 库:

智能指针是存储对象 指向动态分配的指针 (堆)对象。他们的行为很像 内置 C++ 指针,除了它们 自动删除对象 在适当的时候指出。 智能指针特别有用 面对例外,因为他们 确保妥善销毁 动态分配的对象。他们 也可用于跟踪 动态分配的对象共享 由多个所有者。

从概念上讲,可以看到智能指针 拥有指向的对象,并且 因此负责删除 不再需要的对象。

【讨论】:

    【解决方案3】:

    智能指针通过跟踪有多少引用指向内存来处理自己的内存管理。一旦有 0 个引用,它就会为您删除内存。使内存管理更容易。

    【讨论】:

      【解决方案4】:

      智能指针一般是指行为类似于指针的类。您可以使用该类来存储指向您分配的内存的指针,并通过该指针访问数据。

      优点是,当在函数和方法中使用时,智能指针可以在变量超出范围时自动释放内存。否则,当函数无法释放所有分配的内存时,这是内存泄漏的主要机会。

      例如,查看http://msdn.microsoft.com/en-us/library/txda4x5t(VS.80).aspx

      【讨论】:

        【解决方案5】:

        智能指针是一个为它所指向的事物动态分配内存的对象,当智能指针超出范围时,它会自动为它所指向的事物释放内存。当您想要在超出范围时释放某些东西,但它太大而无法放入堆栈(或有其他问题导致无法放入堆栈)时,它很有用。

        【讨论】:

        • 我不确定智能指针是否一定负责分配内存。
        • 确实如此。此外,还有一些引用计数智能指针在引用计数为零之前不一定会释放内存。
        【解决方案6】:

        智能指针本质上管理在堆上分配的内存和在堆栈上分配的对象。

        因为在堆栈上分配的对象具有固定的生命周期(即在它们被声明的范围内),堆内存的释放是确定性的并且保证会发生。

        【讨论】:

        • 可以想象在堆上分配一个指向栈上对象的智能指针。
        【解决方案7】:

        智能指针基本上是执行类似于指针功能的对象 它们用于减少分配和释放时间。对于 C++,一个常见的例子是 auto_ptr

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-17
          相关资源
          最近更新 更多