如何将 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 size
和 int* 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<>::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 习惯用法