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

时间:2017-01-12 15:22:30

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

我用Google搜索,什么也没找到。我想我只是不知道如何输入正确的问题。

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

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

2 个答案:

答案 0 :(得分:4)

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

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 );
}

答案 1 :(得分:2)

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

即:

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

NathanOliver也评论过,另一个选择是将unique_ptr拥有的原始内存指针替换为std::vector