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

上一篇: ptr behaviour while passing through function

下一篇: std::move required on return of std::unique