动态分配std :: unique_ptr有什么用?

时间:2019-02-16 17:52:24

标签: c++ c++11 smart-pointers

使用std::unique_ptr创建new有意义吗?在下面的代码段中,我怀疑由SimpleClass管理的std::unique_ptr对象不会被销毁,除非我自己删除std::unique_ptr。我想不出有什么用处,所以我想知道是否有实际使用过的用处。

  std::unique_ptr<vector_test::SimpleClass>* ptr_to_unique_ptr = new std::unique_ptr<vector_test::SimpleClass>();
  ptr_to_unique_ptr->reset(new vector_test::SimpleClass(555));
  delete ptr_to_unique_ptr;

3 个答案:

答案 0 :(得分:2)

  

使用std::unique_ptr创建new有意义吗?

大多数可能不是。

没有简明的理由说明为什么您已经/应该在已经使用标准dynamic memory allocation techniques的情况下退回到手动内存管理。

  

我想不出一个有用的情况,所以我想知道是否有实际使用它的情况。

我也无法想象这种情况。

答案 1 :(得分:1)

动态分配单个指针很少使用。最接近真实单词的用例是一个单链表,其中我们动态分配一个类实例,该实例包含一个指针以及一些与该节点关联的数据。虽然,实现链接列表的需要很少,因为它很少是数据结构的最佳选择,并且因为标准库已经提供了不错的链接列表设计。

请注意,如果我们要动态分配(智能)指针,则没有充分的理由不使用智能指针来管理该分配。

答案 2 :(得分:1)

  

使用new创建std :: unique_ptr是否有意义?

我想不到。在某些情况下,当包含unique_ptr的作用域结束时,您想防止通过unique_ptr管理的对象被删除。有多种方法可以执行此操作,而不必new本身。

一些例子:

  1. 将对象移动到另一个作用域中的另一个unique_ptr

    unique_ptr
  2. 从函数返回通过std::unique_ptr<int> p1; { std::unique_ptr<int> p2 = std::make_unique<int>( 42 ); p1 = std::move( p2 ); // Destructor of p2 won't delete object, because ownership was transferred. } // Scope of p2 has ended, but object is still managed by p1. std::cout << *p1; 管理的对象。

    unique_ptr
  3. Release所有权并获取原始指针。

    std::unique_ptr<int> MyFun() {
        std::unique_ptr<int> p = std::make_unique<int>( 42 );
        return p;  // No explicit move required, because of RVO
    }