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

在动态分配的数组上使用自动指针的正确方法是什么?

  •  3
  • LoudNPossiblyWrong  · 技术社区  · 14 年前

    如果我使用auto-ptr保存指向动态分配数组的指针,当auto-ptr被杀死时,它将使用一个plain 删除 操作与否 删除[ ] 这样就不会删除我分配的数组。

    如何(正确)在动态分配的数组上使用auto-ptr?

    如果这是不可能的,是否有其他智能指针替代动态分配的数组?

    事先谢谢。

    5 回复  |  直到 10 年前
        1
  •  5
  •   radman    14 年前

    boost::shared_array 是你想要的。

    编辑:

    如果你想避免使用Boost,我建议你只使用 std::vector 它们是数组的底层,不需要担心内存分配。实际上,这是一个比 shared_array 不管怎样。

    因为你表示你想用 auto_ptr 那么你不需要参考计数和所有权模型 共享数组 . 所以只需使用 std::vector 因为它们是为替换动态分配的数组而定制的,而这正是您使用 自动PTR .

        2
  •  10
  •   jamesdlin    10 年前

    你没有。 std::auto_ptr 不用于数组。

    避免使用 new[] delete[] . 使用 std::vector 相反。 This is Stroustrup's recommendation too.

    如果使用数组是因为需要将它传递给需要指针的代码,那么只需传递(非空)向量第一个元素的地址即可。例如:

    std::vector<char> buf(size);
    fgets(&buf[0], buf.size(), stdin);
    

    注意,在C++ 11中,可以(也应该)使用 buf.data() 而不是 &buf[0] ; BUF.DATA() 也适用于空向量。

        3
  •  1
  •   Anthony Atmaram    14 年前

    如果您想自己做(即不使用boost),那么首先将动态数组包装在一个类中。调用类的析构函数 delete[] . 然后 auto_ptr<Wrapper> 可以打电话 delete 在类上,内存将被正确释放。

        4
  •  1
  •   Cubbi    14 年前

    在这种情况下,正确的boost智能指针是 boost::scoped_array 不是更著名的boost::shared_数组,因为 std::auto_ptr 是唯一所有权指针。这个 相反的 共享所有权指针。在C++ 0x中,正确的指针是 std::unique_ptr ,如果它指向数组,则将调用delete[],如果它指向单个对象,则调用delete。

        5
  •  0
  •   Kate Gregory    14 年前

    使用auto-ptr的正确方法(使用动态分配的数组或任何其他方法)是使用其他方法。在您的案例中,可以是boost::shared_array,也可以是shared_ptr>或者shared_ptr>。在一般情况下,共享指针或唯一指针是实际智能的智能指针。停止使用自动指针。

    推荐文章