【发布时间】:2015-10-24 12:47:17
【问题描述】:
在下面的代码 sn-p 中,我在传递 unique_ptr 作为值时遇到分段错误。通常这是 auto_ptr 的已知问题,因为所有权问题(受让人指针变为 NULL)在分配后无法访问它。 但是为什么我面临与 unique_ptr 相同的问题,即使它具有移动语义。
我理解 auto_ptr 使用复制构造函数和 unique_ptr 使用移动函数来转移所有权。但是在这两种情况下,受让人指针都变为空,那么这里有移动语义的意义是什么。我相信如果 unique_ptr 作为如下语句中的值传递,编译器应该会闪现错误,因为复制构造函数在 unique_ptr 中是私有的。您能否就这种行为对此有所了解。
unique_ptr<Test> a = p;//deleted function (copy constructor).
这里是sn-p的代码:
#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;
}
【问题讨论】:
-
你仍然可以通过传递引用来访问它。
-
对于
unique_ptr和move,您必须明确了解所有权转让。 -
在rust,类似的代码会产生编译错误:-)
-
并且拥有 unique_ptr 所有权在编译时处理。
-
您将对象的所有权移动到函数中(由显式移动表示),将原始指针留空(nullptr),然后取消引用该指针。您期望会发生什么,为什么要将唯一的 ptr 传递给函数?一个正常的或会做得很好。
标签: c++ smart-pointers unique-ptr auto-ptr