我想了解為什么unique_ptr
解構式要求型別在銷毀時是完整的,而shared_ptr
. Howard Hinnant 的這篇博客簡要提到它與靜態和動態洗掉器有關。我正在尋找更詳細的解釋,說明為什么會出現這種情況(它可能是特定于編譯器的實作,在這種情況下,一個例子會有所幫助)。使用動態洗掉器,它是否會限制解構式被行內?
uj5u.com熱心網友回復:
Howard Hinnant 正在簡化。他的確切意思是如果你使用默認洗掉器std::unique_ptr
,你需要一個完整的型別。對于默認洗掉器,它只需要delete
您呼叫。
靜態和動態洗掉器的要點是
class A;
void static_delete(A* p)
{
delete p;
}
void (*dynamic_delete)(A*) = /* somehow */;
int main()
{
A* p = /* somehow */;
static_delete(p); // undefined behaviour
dynamic_delete(p); // maybe not
}
只要dynamic_delete
指向一個在 whereA
也被定義的函式,你就有了明確定義的行為。
為了防止未定義的行為,默認洗掉器檢查完整型別,可以實作為
void default_delete(A* p)
{
static_assert(sizeof(A) > 0);
delete p;
}
uj5u.com熱心網友回復:
我想了解為什么
unique_ptr
解構式要求型別在銷毀時是完整的,而情況并非如此shared_ptr
我相信這就像默認解構式需要知道資料成員的大小一樣簡單。因為unique_ptr
洗掉器是物件表示的一部分,而對于shared_ptr
實際的洗掉器來說并不那么相關,因為它存盤在控制塊中,無論您使用哪種洗掉器
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/460432.html
上一篇:此指標不能在建構式中使用別名:
下一篇:指向模板類的共享指標向量