![](/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.