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