gpt4 book ai didi

c++ - 通过函数时的 unique_ptr 行为

转载 作者:行者123 更新时间:2023-11-30 01:47:17 26 4
gpt4 key购买 nike

在下面的代码片段中,我在将 unique_ptr 作为值传递时出现段错误。通常这是 auto_ptr 的已知问题,因为所有权问题(受让人指针变为 NULL),它在分配后无法访问。但为什么我在 unique_ptr 上遇到同样的问题,即使它具有移动语义。

据我了解,auto_ptr 使用复制构造函数,而 unique_ptr 使用移动函数来转移所有权。但是在这两种情况下,受让人指针都变为空,那么这里有移动语义的意义是什么。我相信如果 unique_ptr 像下面的语句一样作为值传递,编译器应该闪现错误,因为复制构造函数在 unique_ptr 中是私有(private)的。关于这种行为,你能解释一下吗?

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 转换为右值引用。 unique_ptr 有一个采用右值引用的构造函数(移动构造函数),因此它使用此移动构造函数构造按值参数,并且没有编译错误。

除非您想转让所有权,否则不应按值传递 unique_ptr

如果您转移所有权,则外部作用域中的 unique_ptr 不再拥有任何东西,取消引用它是未定义的行为。

在这种情况下,您应该通过 const 引用通过 Test:

void fun(const Test& t) {
std::cout << t.m_a << std::endl;
}

int main(){
auto p = std::make_unique<Test>(5);
fun(*p);
}

参见 here有关如何传递智能指针的更多信息。

关于c++ - 通过函数时的 unique_ptr 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31769888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com