shared_ptr是一種智慧型指標(smart pointer)。shared_ptr的作用有如同指標,但會記錄有多少個shared_ptrs共同指向乙個物件。
用法
1、刪除共享物件
使用shared_ptr解決的主要問題是知道刪除乙個被多個客戶共享的資源的正確時機。
下面是乙個簡單易懂的例子,有兩個類 a和 b, 它們共享乙個int例項。使用 boost::shared_ptr, 你必須包含」boost/shared_ptr.hpp」.
#include "boost/shared_ptr.hpp"
#include
class a
void
value(int i)
};class b
intvalue() const
};int main()
類 a和 b都儲存了乙個 shared_ptr. 在建立 a和 b的例項時,shared_ptr temp被傳送到它們的建構函式。這意味著共有三個 shared_ptr:a, b, 和 temp,它們都引向同乙個int例項。如果我們用指標來實現對乙個的共享,a和 b必須能夠在某個時間指出這個int要被刪除。在這個例子中,直到main的結束,引用計數為3,當所有 shared_ptr離開了作用域,計數將達到0,而最後乙個智慧型指標將負責刪除共享的 int.
2、標準容器
把物件直接存入容器中有時會有些麻煩。以值的方式儲存物件意味著使用者將獲得容器中的元素的拷貝,對於那些複製是一種昂貴的操作的型別來說可能會有效能的問題。此外,有些容器,特別是 std::vector, 當你加入元素時可能會複製所有元素,這更加重了效能的問題。最後,傳值的語義意味著沒有多型的行為。如果你需要在容器中存放多型的物件而且你不想切割它們,你必須用指標。如果你用裸指標,維護元素的完整性會非常複雜。從容器中刪除元素時,你必須知道容器的使用者是否還在引用那些要刪除的元素,不用擔心多個使用者使用同乙個元素。這些問題都可以用shared_ptr來解決。
下面是如何把共享指標存入標準庫容器的例子。
#include "boost/shared_ptr.hpp"
#include
#include
class a ;
};class b : public a
};boost::shared_ptr
createa()
int main()
std::cout
<< "the choir is gathered: \n";
iterator end=container.end();
for (iterator it=container.begin();it!=end;++it)
}
這裡有兩個類, a和 b, 各有乙個虛擬成員函式 sing. b從 a公有繼承而來,並且如你所見,工廠函式 createa返回乙個動態分配的b的例項,包裝在shared_ptr裡。在 main裡, 乙個包含shared_ptr的 std::vector被放入10個元素,最後對每個元素呼叫sing。如果我們用裸指標作為元素,那些物件需要被手工刪除。而在這個例子裡,刪除是自動的,因為在vector的生存期中,每個shared_ptr的引用計數都保持為1;當 vector被銷毀,所有引用計數器都將變為零,所有物件都被刪除。有趣的是,即使 a的析構函式沒有宣告為 virtual, shared_ptr也會正確呼叫 b的析構函式!
上面的例子示範了乙個強有力的技術,它涉及a裡面的protected析構函式。因為函式 createa返回的是 shared_ptr, 因此不可能對shared_ptr::get返回的指標呼叫 delete。這意味著如果為了向某個需要裸指標的函式傳送裸指標而從shared_ptr中取出裸指標的話,它不會由於意外地被刪除而導致災難。那麼,又是如何允許 shared_ptr刪除它的物件的呢? 這是因為指標指向的真正型別是 b; 而b的析構函式不是protected的。這是非常有用的方法,用於給shared_ptr中的物件增加額外的安全性。
boost share ptr智慧型指標使用示例
12 3456 78910 1112 1314 1516 1718 1920 2122 2324 2526 2728 2930 3132 3334 3536 3738 3940 4142 4344 4546 4748 4950 5152 5354 5556 5758 5960 6162 6364 6...
學習學習再學習
如果乙個技能足夠複雜 比如從零學程式設計 那就不要指望讀完一本書就可以打天下。多買幾本書同類的書 因為每個作者的出發點是不一樣的,哪怕對同乙個概念都有不同的解釋說明。理解知識的重要過程之一就如牛的反芻一樣,要嚼一遍 嚥下去 再吐出來 再嚼一遍 再嚥下去 所以,既然一本書可以讀幾遍,那麼同一話題多應該...
學習 學習 再學習
原本要使用vs2005開發乙個b s專案的,沒有想到只能先暫時停停了,居然跟不上技術的發展了,呵呵,一直使用delphi delphi也沒能跟上 沒有想到轉到vs2005上竟然有這麼多要學的東西,當然目的是了做乙個好的系統。最近一直在學習asp.net ajax,雖然專案停了,但是我覺得值得,有很多...