ptr行为,同时通过函数
在下面的代码片段中,我将unique_ptr作为值传递给了分段错误。 通常这是auto_ptr的已知问题,原因是所有权问题(Assignee指针变为NULL),赋值后无法访问它。 但为什么即使它具有移动语义,我仍然面临与unique_ptr相同的问题。
我所了解的auto_ptr使用拷贝构造函数和unique_ptr使用移动功能来传输所有权。 但是,在这两种情况下,受让人指针都变为空,那么在这里移动语义的意义何在。 我相信如果unique_ptr作为下面的语句传递的值,编译器应该会出现错误,因为复制构造函数在unique_ptr中是私有的。 你能否就这种行为提出一些看法。
unique_ptr<Test> a = p;//deleted function (copy constructor).
以下是代码片段:
#include<iostream>
#include<memory>
using namespace std;
class Test
{
public:
Test(int a = 0 ) : m_a(a)
{
}
~Test( )
{
cout<<"Calling destructor"<<endl;
}
int m_a;
};
//***************************************************************
void Fun(std::unique_ptr<Test> p1 )
{
cout<<p1->m_a<<endl;
}
//***************************************************************
int main( )
{
std::unique_ptr<Test> p( new Test(5) );
Fun(std::move(p));
cout<<p->m_a<<endl;
return 0;
}
通过编写std::move(p)
您可以将p
转换为r值引用。 unique_ptr
具有一个构造函数,它接受一个r值引用(移动构造函数),因此它使用此移动构造函数构造by-value参数,并且没有编译错误。
除非您想转让所有权,否则您不应该按值传递unique_ptr
。
如果您转让所有权,那么外部作用域中的unique_ptr
不再拥有任何内容,并且取消引用它是未定义的行为。
在这种情况下,您应该通过Test
通过const引用:
void fun(const Test& t) {
std::cout << t.m_a << std::endl;
}
int main(){
auto p = std::make_unique<Test>(5);
fun(*p);
}
有关如何传递智能指针的更多信息,请参见此处。
这里删除了拷贝构造函数。 unique_ptr
具有使用的移动构造函数,因为您明确要求使用std::move
从源std::move
。
您不应该使用移出的值,除非将其分配给它。
这不是一个错误。 编译器可能会发出警告,但由于您已明确移动,因此可能会合理地假定您知道自己在做什么。
而不是使用unique_ptr作为值,请将相同作为参考。 你创建一个独特的指针。 然后使用移动构造函数从那个构造另一个unique_ptr。 所以原始设置为空。 当你移动一个unique_ptr时会发生这种情况。 老实说,因为我没有得到auto_ptr的机会,所以不能评论这种行为。
void Fun( const std::unique_ptr<Test>& p1 )
{
cout<<p1->ma;
}
链接地址: http://www.djcxy.com/p/59683.html