智慧型指標 一 shared ptr

2021-07-08 11:46:00 字數 1622 閱讀 1495

特點:內部維護乙個計數來判斷記憶體釋放需要釋放。

和boost::scoped_ptr相比,boost::shared_ptr可以共享物件的所有權,因此其使用範圍基本上沒有什麼限制(還是有一些需要遵循的使用規則,下文中介紹),自然也可以使用在stl的容器中。另外它還是執行緒安全的,這點在多執行緒程式中也非常重要。

boost::shared_ptr的使用規則:

boost::shared_ptr並不是絕對安全,下面幾條規則能使我們更加安全的使用boost::shared_ptr:

1.避免對shared_ptr所管理的物件的直接記憶體管理操作,以免造成該物件的重釋放

2.shared_ptr並不能對迴圈引用的物件記憶體自動管理(這點是其它各種引用計數管理記憶體方式的通病)。

3.不要構造乙個臨時的shared_ptr作為函式的引數。

#include

boost::shared_ptrsp1(new testsample());

std::cout << "the sample now has " << sp1.use_count() << " references\n";

sp1->printsomething();

boost::shared_ptrsp2 = sp1;

std::cout << "the sample now has " << sp2.use_count() << " references\n";

sp1.reset();

std::cout << "after reset sp1. the sample now has " << sp2.use_count() << " references\n";

sp2.reset();

std::cout << "after reset sp2.\n";

輸出:

testsample constructor...!

the sample now has 1 references

testsample printsomething...

the sample now has 2 references

after reset sp1. the sample now has 1 references

testsample destructor...!

after reset sp2.

請按任意鍵繼續. . .

shared_array說明:

shared_array是shared_ptr和scoped_array的結合體,既具有shared_ptr的優點,也有scoped_array的缺點。

在使用shared_array過載的operator要注意,shared_array不提供陣列索引的範圍檢查,如果超過了動態陣列大小的索引或者是負數索引將引發未定義行為。

shared_array能力有限,大多情況下可以用shared_ptr或者std::vector代替。

這兩個方案具有更高的靈活性和更好的安全性,所付出的代價幾乎可以忽略不計。

shared ptr智慧型指標

智慧型指標是乙個行為類似指標的物件。我們在使用堆記憶體時,都需要及時地進行釋放,避免造成記憶體洩漏。但我們偶爾也會忘記將其釋放掉,從而造成記憶體洩漏。並且,在釋放的時候,我們可能對某乙個指標進行了重複釋放,導致程式崩潰的問題。為了能夠解決這些問題,從而有了智慧型指標的設計。智慧型指標一共有四種,分別...

shared ptr(智慧型指標)

只要將 new 運算子返回的指標 p 交給乙個 shared ptr 物件 託管 就不必擔心在 寫delete p語句 實際上根本不需要編寫這條語句,託管 p 的 shared ptr 物件在消亡時會自動執行delete p。而且,該 shared ptr 物件能像指標 p 樣使用,即假設託管 p ...

智慧型指標shared ptr

shared ptr在脫離自己的作用域時候,會自動呼叫析構函式。作用域包含 塊 被呼叫函式 main函式等。include include include include using namespace std class a a int n private int n string str voi...