以前學智慧型指標時有點想當然了,一直以為智慧型指標很智慧型,不管你讓它管理的是單個資源還是連續的資源它都能正確的將資源釋放,現在發現自己大錯特錯。
先看**:
1 #include 2 #include 3case1:管理單個資源using
namespace
std;
4class
test
58 ~test()
9 };
1這種情況是沒有問題的,程式結束時自動釋放資源,控制台輸出"test is construct" 和 "test is destruct"。intmain()
2
case2:管理連續資源
首先,我們知道c++裡釋放單個資源和連續資源的語法是不一樣的,前者用delete,後者用delete[ ]
如:
1那麼如何用智慧型指標管理呢?intmain()
2
錯誤的示範:
1輸出結果如下:intmain()
2
nice,成功滴讓系統報了錯。那麼問題出在哪兒?
其實上述的**和下面這段**的效果相同:
1系統需要的是delete[ ],而你給他的確實delete,系統當然不樂意咯。intmain()
2
正確的姿勢:
上面的例子可以看出,share_ptr的析構函式的預設功能是對你傳進去的資源進行delete操作。
但我們此時的需要是對該指標進行delete[ ]操作,怎麼實現?
實現share_ptr的大佬們很體貼的為我們提供了這樣的一種方式:我們在構造share_ptr物件的時候,可能額外滴傳進去乙個引數。
template< class y, class deleter >
shared_ptr( y* ptr, deleter d );
shara_ptr析構的時候,將用我們傳進去的deleter對資源進行析構操作。
deleter的形式可以有多種,如過載過()的類、函式、lambda等等。
1void destructtest(test*pt)26
7class
destructtest815
};16
17int
main()
18);
26return0;
27 }
智慧型指標的釋放
為什麼智慧型指標還需要 release呢,智慧型指標不是不需要進行管理引用計數了嗎,為什麼還需要程式設計師來release?原因是,智慧型指標物件在物件銷毀時釋放所指向的介面,但如果沒有在函式退出前,你銷毀了com庫,那就需要提前來release它。如 coinitialize null 如果在這裡...
C 中的智慧型指標
長久以來 c 最被人詬病的就是它的記憶體管理,寫個稍微複雜點的程式就經常會碰到記憶體洩漏問題。為了解決這個問題,c 也做了許多努力。在 c 98 標準中首先提出了智慧型指標的概念,引入了 auto ptr。但是在實踐中,auto ptr 有不少問題。因此在 c 11 標準中對原有的智慧型指標又做了進...
c 中的智慧型指標
1.智慧型指標的作用 為了防止記憶體洩露的問題 c 程式設計中使用堆記憶體是非常頻繁的操作,堆記憶體的申請和釋放都由程式設計師自己管理。程式設計師自己管理堆記憶體可以提高了程式的效率,但是整體來說堆記憶體的管理是麻煩的,c 11中引入了智慧型指標的概念,方便管理堆記憶體。使用普通指標,容易造成堆記憶...