![](/img/trans.png)
[英]Why a unique_ptr can be used with std containers, vectors<> for example?
[英]Can std::unique_ptr be used as an argument?
现在,我只是在研究smart_ptr(unique_ptr / shared_ptr)。 我写了这样的测试代码来检查unique_ptr可以用作参数。
typedef struct __T_TEST
{
char cT1;
char cT2;
} T_TEST;
int main(...)
{
...
char szB[2] = {0x61, 0x62};
auto pTest = std::make_unique<T_TEST>();
std::memcpy(pTest, szB, 2);
printf("T1 = [%02x]\n", pTest->cT1);
printf("T2 = [%02x]\n", pTest->cT2);
return 0;
}
然后,我添加了一个使用unique_ptr作为参数的函数,如下所示。
int TestPrint(std::unique_ptr<T_TEST> p_pData)
{
printf("T1 in TestPrint Func = [%02x]\n", p_pData->cT1);
printf("T2 in TestPrint Func = [%02x]\n", p_pData->cT2);
return 0;
}
我只是在printf之后在main函数中调用该函数。 但这是行不通的。
printf("T1 = [%02x]\n", pTest->cT1);
printf("T2 = [%02x]\n", pTest->cT2);
TestPrint(pTest); <- Can't pass the pTest!
return 0;
}
在这种情况下,我无法通过pTest。 为什么不? 我认为在TestPrint函数中pTest是std :: unique_ptr,而p_pData是std :: unique_ptr。 所以是同一类型! 但是我不能。 我想知道为什么它不起作用。
当然,将函数更改为std::unique_ptr<T_TEST>& p_pData
之后,它就可以工作。 但是我不明白为什么即使数据类型相同也无法传递参数。
std :: unique_ptr是仅移动类型(无法复制),如果要将其作为参数传递给函数,则可以
1:通过引用
int TestPrint(std::unique_ptr<T_TEST> const &p_pData)
{
printf("T1 in TestPrint Func = [%02x]\n", p_pData->cT1);
printf("T2 in TestPrint Func = [%02x]\n", p_pData->cT2);
return 0;
}
2:移动
TestPrint(std::move(pTest));
3:不使用unique_ptr作为参数,使用指针
int TestPrint(T_TEST *p_pData)
{
printf("T1 in TestPrint Func = [%02x]\n", p_pData->cT1);
printf("T2 in TestPrint Func = [%02x]\n", p_pData->cT2);
return 0;
}
TestPrint(pTest.get());
指针不利于资源管理,但擅长访问资源,如果不需要将所有权传递给函数,则可以使用指针来替换unique_ptr,这是更灵活的恕我直言,因为原始指针可以与shared_ptr,unique_ptr一起使用,weal_ptr和其他智能指针,但unique_ptr必须仅与unique_ptr一起使用。
在大多数情况下,我仅在要共享(std :: shared_ptr)或转让所有权(std :: unique_ptr)时才将智能指针用作函数参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.