簡體   English   中英

共享指針和原始指針生命周期

[英]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_ptruse_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM