[英]shared pointer and raw pointer lifetime
有人可以簡單地解釋一下為什么這不起作用的原因:
std::shared_pointer<Bar> getSharedPointer() {
return std::make_shared<Bar>();
}
...
auto foo = getSharedPointer().get();
顯然,使用原始指針foo
會導致段錯誤,因為getSharedPointer()
返回的共享指針的生命周期將耗盡。 不知何故,我希望它持續到它的范圍結束(就像它里面的任何塊一樣)。
這是正確的,有沒有類似的例子?
對於getSharedPointer().get();
, getSharedPointer()
返回一個臨時的std::shared_ptr
,它會在表達式之后立即被銷毀,並且它所管理的指針也會被刪除。 在foo
將變為懸空之后,對它的任何取消引用都會導致 UB。
auto foo = getSharedPointer().get();
// foo have become dangled from here
您可以改用命名變量:
auto spb = getSharedPointer();
auto foo = spb.get();
// It's fine to use foo now, but still need to note its lifetime
// because spb will be destroyed when get out of its scope
// and the pointer being managed will be deleted too
auto foo = getSharedPointer().get();
每當一個函數返回一個不是引用的類型時,調用該函數的結果就是一個右值。 此外,因為函數getSharedPointer()
返回一個類類型,所以結果是一個臨時對象。
該臨時對象的生命周期被定義為最外層表達式的計算結束,這里是getSharedPointer().get()
。 一旦foo
變量被初始化,擁有的智能指針就會被銷毀; 當最后一個擁有該對象的shared_ptr
被銷毀時,該對象將被刪除。
這里getSharedPointer()
總是返回不共享托管對象的shared_ptr
( use_count()
為 1),因此當最后一個shared_ptr
副本被銷毀時,該對象被銷毀並且指向該對象的指針無效。
(我不確定你為什么在這里返回shared_ptr
而不是unique_ptr
。)
正確使用智能指針或任何“擁有”(控制其生命周期)其他資源(您仍然可以直接訪問的資源)的類,是讓“智能”指針/所有者保持活動狀態,只要您需要訪問資源。
因此需要命名“智能”指針(擁有對象)。 另外,我不確定您是否真的想隱藏它是帶有auto
的閱讀器視圖中的智能指針這一事實。
std::shared_pointer<Bar> foo = getSharedPointer();
// use foo.get()
您可能想要隱藏托管對象的確切類型:
std::shared_pointer<auto> foo = getSharedPointer();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.