日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Effective C++ 小笔记:条款13-17(第三章)

發布時間:2025/6/15 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Effective C++ 小笔记:条款13-17(第三章) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?  常用的資源有:內存、文件描述器(file descriptor)、互斥鎖(mutex locks)、圖形界面中的字體和筆刷、數據庫連接、以及網絡sockets。這些資源一般動態創建和分配,也就是一個指針。不論哪一種資源,重要的是,當你不再使用時,必須將它還給系統。

?

條款13:以對象管理資源

  把資源放進對象里,我們便可以依賴C++的 析構函數 自動調用機制,確保資源被釋放。對象在作用域結束時,其析構函數自動對其所指資源(對象)的指針調用delete。?

  C++提供了2種用于管理資源的類,“智能指針” std::auto_ptr,和 “引用計數型智能指針” ?std::tr1::shared_ptr。它們叫做智能指針,但本質是pointer-like對象,成員變量是表征資源的指針。二者使用方法一樣:

?1?class?Investment?{?...?};   
?2?Investment*?createInvestment();?
?3?
?4?void?f()
?5?{
?6?????...
?7?????std::tr1::shared_ptr<Investment>?pInv1(createInvestment());???????
?8?????????????????????????//?pInv1?points?to?the?object?returned?from?createInvestment
?9?????std::tr1::shared_ptr<Investment>?pInv2(pInv1);????
10?????????????????????????//?both?pInv1?and?pInv2?now?point?to?the?object
11??????????????????????????????????
12?????pInv1?=?pInv2;??????//OK????????????????????
13?????...
14?}

?

?  auto_ptr不讓多個auto_ptr同時指向同一個對象。如果真的那樣,對象會被刪除一次以上,而那會導致“未定義行為”。為了預防這個問題,auto_ptr有一個不尋常的性質: 若通過copy構造函數或copy assignment操作符復制它們,它們會變成null,而復制所得的指針將取得資源的唯一擁有權。還記得嗎,STL容器要求其存儲的元素具有正常的復制行為,因此這些容器容不得auto_ptr。

  shared_ptr具有正常的復制行為。可存儲于STL容器。

  兩者在析構函數內都對資源指針執行delete,而不是delete[]。所以動態分配的數組用它們管理是個餿主意。vector和string幾乎總是可以取代動態分配得到的數組。

?  兩者有一個共同的名字,RAII對象。為防止資源泄露,請使用RAII對象。它們在構造函數中獲得資源,并在析構函數中釋放資源。通常,我們選擇shared_ptr,因為其復制行為正常、直觀。而auto_ptr復制動作會使他指向NULL。

  兩外,tr1::shared_ptr 允許當智能指針被建立起來時制定一個資源釋放函數(所謂刪除器,"deleter")綁定于智能指針身上(auto_ptr 就沒有這個能耐)。當引用次數為0時候,刪除器 被調用。?

  tr1::shared_ptr 支持定制型刪除器。可以被用于自動解除互斥鎖(mutexes, 見條款14)等等。?

?

條款17:以獨立語句將newed 對象置入智能指針

1?processWidget(std::tr1::shared_ptr<Widget>(new?Widget),?priority()); ??//非獨立語句
2?std::tr1::shared_ptr<Widget>?pw(new?Widget);????              //獨立語句
3?processWidget(pw,?priority());

?

?  1行中,編譯器要執行三個操作。其中兩個參數的計算次序編譯器先做什么是有彈性的。如果如果priority函數在new之后執行,并且函數出現異常,新生成的Widget對象將未置入智能指針,資源產生泄漏。2、3行則解決了這個問題。

轉載于:https://www.cnblogs.com/younes/archive/2010/03/08/1681074.html

總結

以上是生活随笔為你收集整理的Effective C++ 小笔记:条款13-17(第三章)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。