代码之家  ›  专栏  ›  技术社区  ›  Amir Rachum

如何使用C++智能指针?

  •  11
  • Amir Rachum  · 技术社区  · 14 年前

    我使用C++已经有一段时间了,我仍然对使用智能指针感到不太舒服,我只是在编辑一些使用它们的代码时才使用它们,从来没有用我自己的代码(可能值得说我是学生)。

    你能解释什么是智能指针的类型,它们是如何工作的,什么时候使用它们吗?

    另外,在其他人编写的接口中接收或传递原始指针时,“协议”是什么?

    谢谢。

    5 回复  |  直到 13 年前
        1
  •  16
  •   dirkgently    14 年前

    C++ 98不提供任何智能指针 auto_ptr 这里面充满了自己的问题。C++0X试图通过引入更多的品种来解决这个问题。 shared_ptr , unique_ptr 等等)。同时,最好的办法是使用boost。看看你能吃到的各种口味 here . 推动是社区驱动的,广泛测试,当然是免费的。有一些优秀的文档和示例代码可以帮助您开始。

    你能解释什么是智能指针的类型,它们是如何工作的,什么时候使用它们吗?

    它们有很多。简而言之:

    scoped_ptr <boost/scoped_ptr.hpp> 单一所有权 物体。不可复制的

    scoped_array <boost/scoped_array.hpp> 简单鞋底 阵列的所有权。不可复制的

    SelddPPTR <boost/shared_ptr.hpp> 对象所有权在 多个指针。

    shared_array <boost/shared_array.hpp> 数组 多人共享所有权 指针。

    weak_ptr <boost/weak_ptr.hpp> 非占有 对象的观察者 SydDypTR。

    intrusive_ptr <boost/intrusive_ptr.hpp> 共享 嵌入对象的所有权 引用计数。

    (这来自Boost文档,请注意它们也有用于此类指针的容器!)

    另外,在其他人编写的接口中接收或传递原始指针时,“协议”是什么?

    对我来说,最重要的规则是:

    • 施工资质
    • 不解除分配我没有分配的东西
    • 检查所有权/移动语义的转移
        2
  •  1
  •   Sadeq    14 年前

    智能指针类型是一个抽象层,用于自动处理内存的分配和释放过程,其构造函数函数,通过指针获取分配的内存及其析构函数,释放分配的内存。当然,构造函数和析构函数可以是内联的(因此没有调用它们的开销)。例如:

    {
        int* raw = new int(40);
        auto_ptr<int> sp(raw); //inline constructor: internal_holder = raw
        //...
        //inline destructor: delete internal_holder
    }
    

    在C++中,间接使用指针(隐藏在类后面)是很好的。创建新智能指针的开销可以忽略不计。但是共享的指针更重,这是因为它的引用计数行为(它是引用计数)。

    当我们想要使用从其他人编写的函数中接收到的原始指针时,如果这个原始指针不应该被我们自己释放,那么我们就不应该使用智能指针。

        3
  •  0
  •   Puppy    14 年前

    没有关于何时使用智能指针的规则。更合适的是,尽可能使用智能指针。原始指针在编写良好的C++代码中是罕见的。当您收到一个原始指针时,如果您有责任解除分配它,请将它包装在一个自释放的自定义写入智能指针中。

        4
  •  0
  •   David    14 年前

    用即将到来的C++0X标准完成答案和可用的答案。这些链接提供了有关何时以及如何使用它们的示例。它还记录了共享资源和弱资源之间的关系。

    http://www2.research.att.com/~bs/C++0xFAQ.html#std-shared_ptr

    http://www2.research.att.com/~bs/C++0xFAQ.html#std-weak_ptr

    http://www2.research.att.com/~bs/C++0xFAQ.html#std-unique_ptr

        5
  •  0
  •   Chandra Sekhar    13 年前

    关于STL AutoPPTR,我建议阅读Habor萨特的《优秀C++书籍的作者》GuloFothWea:使用这个 Link