簡體   English   中英

取消引用rvalue shared_ptr

[英]Dereference a rvalue shared_ptr

我正在使用一個導出如下函數的庫:

// there is some type T
std::shared_ptr<T> foo(params);

雖然以下代碼工作正常:

auto p = foo(params);
auto & v0 = *p;
// use v0 as a T's reference

以下崩潰:

auto & v1 = *foo(params);
// use v1 as a T's reference

那么v0v1什么區別? 非常感謝任何幫助。

shared_ptr指向的對象只有在至少有一個仍然指向它的共享指針存在時才存在。

在你的例子中,可能只有一個這樣的指針,它由foo返回。

對於v0p成為shared_ptr使對象保持活動狀態。

對於v1 ,只有一個臨時共享指針僅在v1初始化期間存在。 指向的指針和對象在您使用引用時消失,使其在使用時成為懸空。

該聲明

auto & v1 = *foo(params);

是一種潛在的未定義行為

函數foo可能在內部構造一個std::shared_ptr ,並將其作為臨時對象(技術上是一個prvalue )返回給調用者,該臨時對象應該被分配給某個變量。

您不會將表達式的智能指針分配給任何變量。 但是,您抓住(使用*運算符)指向的對象並將其分配給引用v1

在表達式求值結束時,臨時std::shared_ptr將被銷毀,並且(作為智能指針)也會指向對象。

因此, auto & v1指的是被破壞的對象,訪問它是一種未定義的行為(在大多數情況下會產生分段錯誤)。

在第一個示例中, p保留在范圍內,保持對對象的引用,從而使其保持活動狀態。 在第二個示例中,在創建v1之后銷毀shared_ptr ,這會破壞對象(假設它是唯一的引用)並使v1指向未分配的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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