原文來(lái)自:
http://imcc.blogbus.com/logs/162618478.html
在C++11中,我們可以使用shared_ptr管理某個(gè)對(duì)象的所有權(quán),負(fù)責(zé)對(duì)象的析構(gòu)。然而在某些情況下,我們只是希望安全的訪問(wèn)某個(gè)對(duì)象,而不想擁有這個(gè)對(duì)象的所有權(quán),對(duì)這個(gè)的析構(gòu)負(fù)責(zé)(有點(diǎn)像電視劇中的那些不負(fù)責(zé)任的男人哦,只是玩玩而已,不會(huì)負(fù)責(zé))。在這種情況下,我們可以使用表示弱引用的weak_ptr。
weak_ptr可以由一個(gè)shared_ptr構(gòu)建,表示這個(gè)weak_ptr擁有這個(gè)shared_ptr所指向的對(duì)象的訪問(wèn)權(quán),注意,這里僅僅是訪問(wèn)權(quán),它不會(huì)改變智能指針的引用計(jì)數(shù),自然也就不會(huì)去析構(gòu)這個(gè)對(duì)象。利用weak_ptr,我們就可以安全地訪問(wèn)那些不具備所有權(quán)的對(duì)象。
一個(gè)現(xiàn)實(shí)中的例子就是學(xué)校的傳達(dá)室,傳達(dá)室擁有一本學(xué)生的名單,如果某個(gè)電話來(lái)了找某個(gè)學(xué)生,傳達(dá)室會(huì)根據(jù)花名冊(cè)去嘗試訪問(wèn)這個(gè)學(xué)生,如果這個(gè)學(xué)生還在學(xué)校,就直接呼叫這個(gè)學(xué)生,如果已經(jīng)離開(kāi)了,這給這個(gè)學(xué)生留一個(gè)消息。在這里,花名冊(cè)上的學(xué)生可能還在學(xué)校(對(duì)象還存在),也可能已經(jīng)離開(kāi)學(xué)校(對(duì)象已經(jīng)析構(gòu)),我們都需要對(duì)其進(jìn)行訪問(wèn),而weak_ptr就是用來(lái)訪問(wèn)這種不確定是否存在的對(duì)象的。