簡體   English   中英

提升 shared_ptr 運算符 =

[英]boost shared_ptr operator =

這是代碼示例

class A{
  int i;
public:
  A(int i) : i(i) {}
  void f() { prn(i); }
};

int main()
{
  A* pi = new A(9);
  A* pi2= new A(87);
  boost::shared_ptr<A> spi(pi);
  boost::shared_ptr<A> spi2(pi2);
  spi=spi2;
  spi->f();
  spi2->f();
  pi->f();
  pi2->f();
}

output:

87
87
0
87

問題是output為什么是0?

文檔注釋:效果:等同於 shared_ptr(r).swap(*this)。

但是如果shared_ptr objects 剛剛交換,結果應該是 9。如果第一個 object 被刪除,應該有 Segmentation fault。

那為什么是0?

請注意交換的內容:

shared_ptr(r).swap(*this)
// ^^^^^^^^^^

這是從 r 構造的臨時r 臨時對象立即從 scope 中退出並終止,無論這對擁有的資源有何影響。 由於在您的代碼中spi*spi的唯一所有者,因此 object 被刪除,您隨后對 pi- pi->f()的訪問只是未定義的行為。

pi已被刪除。 訪問已刪除的 object 的成員是未定義的行為; 您可能會得到 0、其他一些值或分段錯誤。

那為什么是0?

所以什么!

spi分配一個新值將刪除它指向的先前 object。 這使得pi成為一個不能再使用的懸空指針。 調用pi->f()是未定義的行為,可以有任何結果。

pi object 在spi = spi2之后被刪除,誰知道你的運行時為釋放 memory 做了什么。對我來說,它在 Debug 中打印 -572662307,在 Release 中打印 1315904。

暫無
暫無

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

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