2016-04-13 102 views
0

我想了解unique_ptr,但他們讓我有點難住。 考慮下面的代碼:爲什麼將原始指針投射到unique_ptr不會刪除原始文件?

PartClass * part= new PartClass; 

//The OwnerClass is a composite that excpects a unique_ptr 
OwnerClass * owner = new OwnerClass(unique_ptr<PartClass>(part); 

的代碼,我希望原來的指針第二行後 - 部分 - 已被刪除。畢竟,只要你有一個unique_ptr,它就會產生很多大驚小怪,需要被移動等。爲什麼編譯器允許一個原始指針仍然訪問部分對象呢?它不違反unique_ptr的整個概念嗎?

+0

'part'不會被刪除,因爲所有權將被移動到'OwnerClass'中,假設'OwnerClass'將其存儲在某個地方。那是你所困惑的嗎? – TartanLlama

+0

「那麼爲什麼編譯器允許一個原始指針仍然訪問部分對象?是不是違反了unique_ptr的整個概念?」它是一個自由的世界(更像是編譯器),你可以'刪除';如果你喜歡,編譯器不會問你的意圖,如果你想除以零他不會阻止你,這取決於你決定如果你想使用原始指針或正確的'unique_ptr',這裏沒有'laws',有時候你可能想要做一個破解並使用raw .. – Vladp

+0

你似乎對指針有很大的誤解,如果'unique_ptr '會刪除'part',他將如何使用它?如果你談論的是「part」它自己而不是它的引用內容,那麼它就被分配到這個範圍的棧中,並且在你離開範圍時將被刪除。 – Vladp

回答

2

它的工作原理與您可以明確指出指針相同。例如:

std::unique_ptr<int> value = std::make_unique<int>(1); 
int* pValue = value.get(); 

雖然pValue可以訪問存儲它不擁有它,不應該刪除的記憶。在你的例子中,所有權已經被轉移,而恰好有一個仍然指向資源的原始指針,這很好。

+0

謝謝詹姆斯 - 澄清了這個問題。我期望得到unique_ptr太多,即獨佔訪問,顯然不是這種情況。 – schulefant

+0

@schulefant它所保證的是_exclusive ownership_。 –

1

A unique_ptr只是編譯器觀點的另一個類。就目前而言,其中一個ctors接受一個原始指針。它會通過傳入的原始指針釋放內存(通常爲free)。

事實上,您的可變部分指向相同的內存位置並不會改變任何unique_ptr行爲。在這種情況下,這只是另一個本地對象。

事實上,你持有一個原始指針,通過unique_ptr(順序無關緊要)管理相同的內存,可能會導致一個雙重自由和未定義的行爲(希望崩潰)。我建議直接將new PartClass傳遞給unique_ptr初始化。

1

通過將part傳遞給unique_ptr,您將指針的所有權傳遞給unique_ptr

是的,你仍然有一個原始指針,但是你已經賦予了智能指針的所有權,你應該考慮它的限制。你當然不希望被刪除。

1

PartClass對象仍然存在,這就是預期的,所以它絕對不應該被刪除。問題是,爲什麼不將part設置爲空指針,這是因爲它是由你來管理這樣的事情。指針是有效的,你可以使用它,如果你想。如果你不想使用它,不要把它放在周圍。

+0

謝謝皮特 - 你說得對 - 我的問題是真的,爲什麼一部分沒有設置爲空 – schulefant

相關問題