【问题标题】:How to use unique_ptr with std::copy?如何将 unique_ptr 与 std::copy 一起使用?
【发布时间】:2017-01-12 15:22:29
【问题描述】:

我用谷歌搜索并没有找到任何东西。我想我只是不知道如何输入正确的问题。

好的,我的简单 MemoryBlock 类有两个成员数据,int sizeint* data。因此,为了构建一个复制构造函数,我使用 std::copy 来进行内存复制。现在我想尝试使用 C++ 智能指针来替换原始指针。说使用unique_ptr<int> data。以下代码的等价物是什么?因为现在,rhs.data + size 将不起作用。

std::copy(rhs.data, rhs.data + size, data);

【问题讨论】:

  • std::copy(rhs.data.get(), rhs.data.get() + size, data.get());
  • 为什么不使用std::vector
  • std::unique_ptr<int[]> 会不会更好?
  • 为了澄清 campster 的评论,std::unique_ptr<int> 拥有一个分配有 new[] 的指针会很糟糕,因为 std::unique_ptr<int>::~unique_ptr 会有未定义的行为。
  • @NathanOliver 我只是在尝试一些 c++ 基础知识,并试图弄清楚这些新的 c++ 特性对构建类意味着什么。

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


【解决方案1】:

首先,您必须为创建的对象分配数组,然后您可以将值复制到它。例如

MemoryBlock( const MemoryBlock &m ) : size( m.size ), data( new int[m.size] )
{
    std::copy(m.data.get(), m.data.get() + m.size, data.get());
}

考虑到成员数据data必须声明为

std::unique_ptr<int[]> data;

如果你想将移动构造函数添加到类中,你可以通过以下方式定义它

MemoryBlock( MemoryBlock &&m ) : size( 0 ), data( nullptr )
{
    std::swap( m.size, size );
    std::swap( m.data, data );
}

【讨论】:

    【解决方案2】:

    您可以使用std::unique_ptr&lt;&gt;::get() function,它返回指向托管对象的指针,如果没有对象,则返回nullptr

    即:

    std::copy(rhs.data.get(), rhs.data.get() + size, data.get());
    

    正如 NathanOliver 所评论的,另一种选择是将 unique_ptr 拥有的原始内存指针完全替换为 std::vector

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-29
      • 2017-05-22
      • 2015-05-04
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      相关资源
      最近更新 更多