如何将 unique_ptr 与 std::copy 一起使用?

Posted

技术标签:

【中文标题】如何将 unique_ptr 与 std::copy 一起使用?【英文标题】:How to use unique_ptr with 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++ 特性对构建类意味着什么。 【参考方案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。

【讨论】:

以上是关于如何将 unique_ptr 与 std::copy 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

将 const std::unique_ptr 用于 pimpl 习惯用法

将 unique_ptr 与成员函数指针一起使用时出错

将 std::unique_ptr 的子类与 std::variant 一起使用

如何将 std::unique_ptr 初始化为引用

如何将unique_ptr存储在队列中

如何将 unique_ptr 从一组移动到另一组? (C++)