【问题标题】:Accelerated C++: Can I substitute raw pointers for smart pointers?加速 C++:我可以用原始指针代替智能指针吗?
【发布时间】:2011-02-20 00:23:01
【问题描述】:

我喜欢这本书,遗憾的是它没有涵盖智能指针,因为它们当时还不是标准的一部分。那么在阅读本书时,我是否可以将每个提到的指针都替换为智能指针,分别引用?

【问题讨论】:

  • 您是否有书中某个程序的具体示例可以从使用智能指针中受益?直到本书的一半才介绍指针,大多数使用指针的程序都在那里解释如何自己管理它们,即通过实现Vec 类(有效地引入了三规则)并通过句柄类的讨论(动态分配资源的句柄类基本上是一个智能指针)。我很好奇您认为智能指针在哪些方面会有所帮助(我最近没读过这本书。)
  • @james-mcnellis 我同意,到目前为止我还没有读过这本书,这是一个预防性问题。
  • 好的;那时我在阅读本书时不会担心智能指针。阅读本书后,应该很容易理解所有 Boost 智能指针以及它们的工作原理和使用时间:Accelerated C++ 对句柄类提供了非常详尽的解释,应该可以帮助您理解正确的生命周期管理。

标签: c++ pointers reference smart-pointers


【解决方案1】:

“智能指针”有点用词不当。 “聪明”的部分是他们会为你做一些事情,无论你是否需要、想要甚至了解这些事情是什么。这真的很重要。因为有时你会想去商店,智能指针会drive you to church。智能指针解决了一些非常具体的问题。许多人会争辩说,如果你认为你需要智能指针,那么you're probably solving the wrong problem。我个人尽量不偏袒任何一方。相反,我使用了一个工具箱的比喻——你需要真正了解你正在解决的问题,以及你可以使用的工具。只有这样,您才能远程期望为工作选择正确的工具。祝你好运,继续提问!

【讨论】:

    【解决方案2】:

    嗯,有不同种类的智能指针。例如:

    您可以创建一个scoped_ptr 类,当您在代码块中分配任务并且希望资源在其运行范围时自动释放时,这将非常有用。

    类似:

    template <typename T>
    class scoped_ptr
    {
     public:
        scoped_ptr(T* p = 0) : mPtr(p) {}
        ~scoped_ptr() { delete mPtr; }
     //...
    };
    

    此外,您可以创建一个shared_ptr,其行为相同但保持引用计数。一旦引用计数达到 0,您就会解除分配。

    shared_ptr 对于存储在 STL 容器等中的指针很有用。

    所以是的,您可以将智能指针用于程序的大部分用途。 但是要明智地考虑你需要什么样的智能指针以及为什么。

    不要简单地“查找并替换”您遇到的所有指针。

    【讨论】:

    • 另外,虽然创建自己的智能指针很容易,但想出一个没有错误的智能指针却异常困难。在过去的 20 年中,我从事的每个项目都有自己的智能指针,迟早会发现令人讨厌的错误。
    • sbi:呃。它仅用于演示目的。当然它缺少,因此 //...
    • (您需要正确地@address 评论回复,否则我们不会在我们的“回复”选项卡上看到它们。我只是偶然发现了这个。)是的,但它缺少一个 在设计和实现智能指针时非常至关重要。
    • @sbi:那是没有实现。这只是为了说明作用域机制。
    【解决方案3】:

    没有。

    表示对象所有权的指针应替换为智能指针。

    其他指针应该被迭代器替换(在最简单的情况下,它只是一个用于原始指针的typedef,但没有人认为它们需要删除)。

    当然,智能指针和迭代器的实现代码将继续需要原始指针。

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      相关资源
      最近更新 更多