爲了回答您的各種問題:
循環引用是當每2個不同的對象有一個shared_ptr其他對象。
例如:
struct Foo {
shared_ptr<Bar> m_bar;
};
struct Bar {
shared_ptr<Foo> m_foo;
};
void createObject()
{
shared_ptr<Foo> foo(new Foo);
shared_ptr<Bar> bar(new Bar);
foo->m_bar = bar;
bar->m_foo = foo;
//Neither of these objects will be released here
}
這可能會導致無論是對象被free'd,爲Foo將始終保持引用計數欄上方1,和Foo不會free'd因爲bar將始終保持其參考計數高於1.
這是weak_ptr可以克服的情況,因爲它們不增加引用計數。正如你所指出的那樣,這不會阻止ptr被釋放,但它確實允許你在使用它之前檢查該對象是否存在,這是你不能用標準指針做的。
至於你提供的例子,你應該幾乎總是使用智能指針而不是原始指針,因爲它們允許對象在超出範圍時自動釋放,而不必確保它自己完成,這可能容易出錯。在有例外的情況下尤其如此,它可以輕鬆地跳過您編寫的任何發佈代碼。
例如,下面的代碼可能會導致問題:
Foo* foo = createObject();
foo.doSomething();
deleteObject(foo);
如果foo.doSomething是除外,然後DeleteObject的永遠不會調用和Foo不會free'd。
然而,這將是安全的:
shared_ptr<Foo> foo = createObject();
foo.doSomething();
shared_ptr的會自動在代碼塊結束時發佈的,無論是否發生異常。
有指針和智能指針在這裏的一個相當不錯的討論:Pointers, smart pointers or shared pointers?
看看這個線程的開始:[智能指針(增強)解釋](http://stackoverflow.com/questions/569775/smart-pointers-boost-explained) – Bart
看到這裏:http:// stackoverflow.com/questions/6675651/when-should-i-use-c-pointers-over-smart-pointers – Azodious
'weak_ptr'保證它將指向一個有效的對象或將是'null'。與原始指針對比的是,無法判斷指向的對象是否已被銷燬。 –