精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++程序的設計機制3 RAII機制

開發 后端
為了管理內存等資源,C++程序員通常采用RAII機制(資源獲取即初始化),在使用資源的類的構造函數中申請資源,然后使用,最后在析構函數中釋放資源。今天本文為你介紹RAII機制,一起來看。

RAII(Resource Acquisition Is Initialization )機制是Bjarne Stroustrup首先提出的。要解決的是這樣一個問題:

在C++中,如果在這個程序段結束時需要完成一些資源釋放工作,那么正常情況下自然是沒有什么問題,但是當一個異常拋出時,釋放資源的語句就不會被執行。于是Bjarne Stroustrup就想到確保能運行資源釋放代碼的地方就是在這個程序段(棧幀)中放置的對象的析構函數了,因為stack winding會保證它們的析構函數都會被執行。將初始化和資源釋放都移動到一個包裝類中的好處:

  • 保證了資源的正常釋放
  • 省去了在異常處理中冗長而重復甚至有些還不一定執行到的清理邏輯,進而確保了代碼的異常安全。
  • 簡化代碼體積。

1、應用場景

1)文件操作

我們可以是用這個機制將文件操作包裝起來完成一個異常安全的文件類。實現上,注意將復制構造函數和賦值符私有化,這個是通過一個私有繼承類完成的,因為這兩個操作在此并沒有意義,當然這并不是RAII所要求的。

  1. /*  
  2. * =====================================================================================  
  3. *  
  4. * Filename: file.cpp  
  5. *  
  6. * Description: RAII for files  
  7. *  
  8. * Version: 1.0  
  9. * Created: 05/09/2011 06:57:43 PM  
  10. * Revision: none  
  11. * Compiler: g++  
  12. *  
  13. * Author: gnuhpc (http://blog.csdn.net/gnuhpc), warmbupt@gmail.com  
  14. *  
  15. * =====================================================================================  
  16. */  
  17. #include   
  18. #include   
  19. #include   
  20.  
  21. using namespace std;  
  22. class NonCopyable  
  23. {  
  24. public:  
  25. NonCopyable(){};  
  26. private:  
  27. NonCopyable (NonCopyable const &); // private copy constructor  
  28. NonCopyable & operator = (NonCopyable const &); // private assignment operator  
  29. };  
  30.  
  31. class SafeFile:NonCopyable{  
  32. public:  
  33. SafeFile(const char* filename):fileHandler(fopen(filename,"w+"))  
  34. {  
  35. if( fileHandler == NULL )  
  36. {  
  37. throw runtime_error("Open Error!");  
  38. }  
  39. }  
  40. ~SafeFile()  
  41. {  
  42. fclose(fileHandler);  
  43. }  
  44.  
  45. void write(const char* str)  
  46. {  
  47. if( fputs(str,fileHandler)==EOF )  
  48. {  
  49. throw runtime_error("Write Error!");  
  50. }  
  51. }  
  52.  
  53. void write(const char* buffer, size_t num)  
  54. {  
  55. if( num!=0 && fwrite(buffer,num,1,fileHandler)==0 )  
  56. {  
  57. throw runtime_error("Write Error!");  
  58. }  
  59. }  
  60. private:  
  61. FILE *fileHandler;  
  62. SafeFile(const SafeFile&);  
  63. SafeFile &operator =(const SafeFile&);  
  64. };  
  65.  
  66. int main(int argc, char *argv[])  
  67. {  
  68. SafeFile testVar("foo.test");  
  69. testVar.write("Hello RAII");  

 

C++的結構決定了其原生支持RAII,而在Java 中,對象何時銷毀是未知的,所以在Java 中可以使用try-finally做相關處理。

#p#

2)智能指針模擬

一個更復雜一點的例子是模擬智能指針,抽象出來的RAII類中實現了一個操作符*,直接返回存入的指針:

現在我們有一個類:

 

  1. class Example {  
  2. SomeResource* p_;  
  3. SomeResource* p2_;  
  4. public:  
  5. Example() :  
  6. p_(new SomeResource()),  
  7. p2_(new SomeResource()) {  
  8. std::cout << "Creating Example, allocating SomeResource!\n";  
  9. }  
  10. Example(const Example& other) :  
  11. p_(new SomeResource(*other.p_)),  
  12. p2_(new SomeResource(*other.p2_)) {}  
  13. Example& operator=(const Example& other) {  
  14. // Self assignment?  
  15. if (this==&other)  
  16. return *this;  
  17. *p_=*other.p_;  
  18. *p2_=*other.p2_;  
  19. return *this;  
  20. }  
  21. ~Example() {  
  22. std::cout << "Deleting Example, freeing SomeResource!\n";  
  23. delete p_;  
  24. delete p2_;  
  25. }  
  26. }; 

假設在創建SomeResource的時候可能會有異常,那么當p_指向的資源被創建但p2_指向的資源創建失敗時,Example的實例就整個創建失敗,那么p_指向的資源就存在內存泄露問題。

用下邊的這個方法可以為權宜之計:

 

  1. Example() : p_(0),p2_(0)  
  2. {  
  3. try {  
  4. p_=new SomeResource();  
  5. p2_=new SomeResource("H",true);  
  6. std::cout << "Creating Example, allocating SomeResource!\n";  
  7. }  
  8. catch(...) {  
  9. delete p2_;  
  10. delete p_;  
  11. throw;  
  12. }  

 

但是我們可以利用一個對象在離開一個域中會調用析構函數的特性,在構造函數中完成初始化,在析構函數中完成清理工作,將需要操作和保護的指針作為成員變量放入RAII中。

 

  1. template   
  2. class RAII {  
  3. T* p_;  
  4. public:  
  5. explicit RAII(T* p) : p_(p) {}  
  6. ~RAII() {  
  7. delete p_;  
  8. }  
  9. void reset(T* p) {  
  10. delete p_;  
  11. p_=p;  
  12. }  
  13. T* get() const {  
  14. return p_;  
  15. }  
  16. T& operator*() const {  
  17. return *p_;  
  18. }  
  19. void swap(RAII& other) {  
  20. std::swap(p_,other.p_);  
  21. }  
  22. private:  
  23. RAII(const RAII& other);  
  24. RAII& operator=(const RAII& other);  
  25. }; 

我們在具體使用把保護的指針Someresource放在RAII中:

 

 

  1. class Example {  
  2. RAII p_;  
  3. RAII p2_;  
  4. public:  
  5. Example() :  
  6. p_(new SomeResource()),  
  7. p2_(new SomeResource()) {}  
  8. Example(const Example& other)  
  9. : p_(new SomeResource(*other.p_)),  
  10. p2_(new SomeResource(*other.p2_)) {}  
  11. Example& operator=(const Example& other) {  
  12. // Self assignment?  
  13. if (this==&other)  
  14. return *this;  
  15. *p_=*other.p_;  
  16. *p2_=*other.p2_;  
  17. return *this;  
  18. }  
  19. ~Example() {  
  20. std::cout << "Deleting Example, freeing SomeResource!\n";  
  21. }  
  22. }; 

現在即使p_成功而p2_失敗,那么在Stack winding時也會調用RAII的析構函數保證了p_指向的Someresource被析構。這種方法較之例1中需要實現被組合的指針類型相應的接口不同,這里不需要對接口進行封裝。當然,在例1中,你也可以提供一個getPointer的函數直接將句柄提供出來。

其實在Example中,已經不需要析構函數了,因為RAII類會幫它照顧好這一切的。這有點像auto_ptr,本文并不打算深入討論智能指針這個話題。

#p#

3)鎖操作

 

  1. /*  
  2. * =====================================================================================  
  3. *  
  4. * Filename: threadlock.cpp  
  5. *  
  6. * Description: Lock for RAII  
  7. *  
  8. * Version: 1.0  
  9. * Created: 05/09/2011 10:16:13 PM  
  10. * Revision: none  
  11. * Compiler: g++  
  12. *  
  13. * Author: gnuhpc (http://blog.csdn.net/gnuhpc), warmbupt@gmail.com  
  14. *  
  15. * =====================================================================================  
  16. */ 
  17. #include   
  18. #include   
  19. #include   
  20. int counter = 0;  
  21. void* routine(void *ptr);  
  22. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;  
  23. class NonCopyable  
  24. {  
  25. public:  
  26. NonCopyable(){};  
  27. private:  
  28. NonCopyable (NonCopyable const &); // private copy constructor  
  29. NonCopyable & operator = (NonCopyable const &); // private assignment operator  
  30. };  
  31. class ScopeMutex:NonCopyable  
  32. {  
  33. public:  
  34. ScopeMutex(pthread_mutex_t* mutex):mutex_(mutex){  
  35. pthread_mutex_lock( mutex_ );  
  36. }  
  37. ~ScopeMutex(){  
  38. pthread_mutex_unlock( mutex_ );  
  39. }  
  40. private:  
  41. pthread_mutex_t *mutex_;  
  42. };  
  43. int main(int argc, char *argv[])  
  44. {  
  45. int rc1, rc2;  
  46. pthread_t thread1, thread2;  
  47. if( (rc1=pthread_create( &thread1, NULL, routine, NULL)) )  
  48. {  
  49. printf("Thread creation failed: %d\n", rc1);  
  50. }  
  51. if( (rc2=pthread_create( &thread2, NULL, routine, NULL)) )  
  52. {  
  53. printf("Thread creation failed: %d\n", rc1);  
  54. }  
  55. pthread_join( thread1, NULL);  
  56. pthread_join( thread2, NULL);  
  57. }  
  58. void* routine(void *ptr)  
  59. {  
  60. ScopeMutex scopeMutex(&mutex);  
  61. counter++;  
  62. printf("%d\n",counter);  

 

 

2.總結

RAII機制保證了異常安全,并且也為程序員在編寫動態分配內存的程序時提供了安全保證。缺點是有些操作可能會拋出異常,如果放在析構函數中進行則不能將錯誤傳遞出去,那么此時析構函數就必須自己處理異常。這在某些時候是很繁瑣的。

 

【編輯推薦】

  1. C/C++返回內部靜態成員的陷阱
  2. 再駁Linus:思科工程師對C++不得不說的事
  3. C/C++是程序員必須掌握的語言嗎?
  4. 淺析C++中的動態多維數組
  5. Visual C++中實現對圖像數據的讀取顯示
責任編輯:于鐵 來源: CSDN博客
相關推薦

2011-06-09 14:34:04

C++NVI

2011-06-09 14:52:09

Pimpl機制

2023-12-20 12:40:51

C++RAII編程

2010-01-25 18:24:11

C++

2009-08-19 09:57:01

C++ RAII

2023-11-22 12:25:05

C++RTTI

2025-02-18 00:08:00

代碼C++RAII

2010-02-01 17:19:30

C++運行機制

2010-02-02 15:30:05

C++ include

2010-02-04 11:23:25

C++反射機制

2010-02-06 14:04:58

C++內存使用機制

2010-01-13 11:14:06

C++虛表

2023-09-22 09:04:00

C++編程

2015-12-28 11:25:51

C++異常處理機制

2018-03-14 08:33:33

C++元編程云成本

2024-03-04 10:53:08

RAIIC++開發

2022-07-21 09:15:28

C++垃圾回收

2016-12-01 11:20:42

2010-01-13 18:30:18

CC++程序設計

2011-06-07 08:58:31

javascript
點贊
收藏

51CTO技術棧公眾號

国产99久久久国产精品免费看| 国产精品久久久久久久| 色综合久久久久久久久| 欧美一区二区三区在线播放| 这里只有精品6| 午夜日韩在线| 亚洲欧美日韩网| 中文字幕在线视频精品| 操喷在线视频| 亚洲国产成人一区二区三区| av色综合网| 国产无遮挡又黄又爽又色视频| 午夜影院欧美| 精品中文视频在线| 国产成人黄色网址| 18video性欧美19sex高清| 久久精品一区四区| 7777奇米亚洲综合久久| 中文字幕久久熟女蜜桃| 黄色免费成人| xvideos国产精品| 国产毛片毛片毛片毛片毛片毛片| 亚洲毛片在线免费| 疯狂做受xxxx高潮欧美日本| 欧美日韩一级在线| 免费成人av电影| 国产精品一级二级三级| 国产精品电影网站| 日韩伦人妻无码| 久久久久久久久久久妇女| 亚洲乱亚洲乱妇无码| 亚洲成人福利视频| 中文字幕综合| 欧美综合在线视频| 性欧美大战久久久久久久| 黄色小网站在线观看| 国产蜜臀av在线一区二区三区| 国产伦精品一区二区三区免 | 999精品免费视频| 亚洲国产天堂| 欧美午夜视频网站| 欧美极品欧美精品欧美图片| 狂野欧美性猛交xxxxx视频| 中文字幕在线观看不卡视频| 日韩视频专区| 户外极限露出调教在线视频| 91一区二区在线| 国产精品手机视频| 精品国产黄色片| 国内一区二区视频| 91精品国产综合久久久久久久久| 最近中文字幕在线观看| 天堂久久一区二区三区| 欧美综合国产精品久久丁香| 久久狠狠高潮亚洲精品| 激情久久中文字幕| 欧美成人四级hd版| 69av.com| 欧美1区免费| 欧美精品在线免费播放| 日韩欧美综合视频| 91精品国产福利在线观看麻豆| 色婷婷久久一区二区| 欧美精品日韩在线| 欧美疯狂party性派对| 中文字幕av一区中文字幕天堂| 欧美激情视频二区| 久久免费精品视频在这里| 日韩亚洲精品电影| 波多野结衣在线网址| 一本一道久久综合狠狠老 | а√天堂资源官网在线资源| 波多野在线播放| 欧美一二区在线观看| 最近2019好看的中文字幕免费| jizzjizzjizz国产| 欧美99在线视频观看| 国模极品一区二区三区| 九一国产在线观看| 日韩国产欧美在线视频| 国产在线一区二区三区| 国产xxxx孕妇| 99在线精品免费| 日本成人黄色免费看| 在线观看免费版| 依依成人综合视频| 中国丰满人妻videoshd| 成人va天堂| 91精品国产全国免费观看| 91成人在线观看喷潮蘑菇| 日本妇女一区| 色妞一区二区三区| 国产无码精品在线观看| 蘑菇福利视频一区播放| 成人国产精品日本在线| 欧美少妇bbw| 国产欧美一区二区精品忘忧草| 91九色国产ts另类人妖| 看黄在线观看| 欧美日韩国产乱码电影| 国产亚洲精品成人a| 国产成人精品一区二区免费看京 | 久热这里只精品99re8久| 精品亚洲综合| 一二三四社区欧美黄| 大肉大捧一进一出好爽视频| 国产精品美女久久久久| 亚洲精品视频免费在线观看| 日韩成人毛片视频| 免费日韩一区二区| 91成人免费看| av在线资源网| 欧美视频一二三| 日韩av福利在线观看| 亚洲精品国模| 欧美激情视频一区| 在线观看免费黄色小视频| 99久久精品免费看国产免费软件| 亚洲图片小说在线| 性感女国产在线| 日韩精品一区二区三区在线 | 97精品久久久中文字幕免费| 亚洲一区二区激情| 久久综合九色综合97婷婷女人 | 日韩欧美国产电影| 男人的天堂av网| 国产日韩一区二区三区在线播放| 亚洲free性xxxx护士hd| 在线免费观看黄| 色视频成人在线观看免| 荫蒂被男人添免费视频| 欧美精品一卡| av蓝导航精品导航| h网站久久久| 337p亚洲精品色噜噜狠狠| 97在线观看免费视频| 国产毛片一区| 精品亚洲一区二区三区四区五区高| 成人看片免费| 欧美精品久久久久久久多人混战 | 美女亚洲一区| 国模视频一区二区| 丰满人妻一区二区| 一区二区三区精品| 亚洲少妇一区二区| 国产精品hd| 91精品国产高清久久久久久91裸体 | 欧美一二三区| 波多视频一区| 亚洲无线码在线一区观看| 好看的av在线| 久久久午夜电影| 免费在线观看的毛片| 亚洲人成精品久久久| 欧美在线视频在线播放完整版免费观看| 亚洲欧美另类一区| 香蕉成人啪国产精品视频综合网| 国产亚洲精品成人a| 激情久久久久| 国内一区在线| 欧美成人h版| 国产亚洲精品综合一区91| 国产精品熟女视频| 国产精品久久毛片av大全日韩| 久久婷五月综合| 久久精品一区二区不卡| 51国偷自产一区二区三区的来源| 色黄网站在线观看| 亚洲精品电影在线观看| 少妇久久久久久久| 亚洲视频资源在线| 欧洲成人午夜精品无码区久久| 激情国产一区| 欧美日韩在线一区二区三区| 欧美男男gaygay1069| 欧美插天视频在线播放| 三级在线观看网站| 午夜精品久久久久久久久久久| 亚洲av无码一区二区二三区| 日本不卡高清视频| 激情五月五月婷婷| 日韩精品丝袜美腿| 国产精品久久久久久一区二区| av文字幕在线观看| 日韩精品在线免费| 亚洲一区二区影视| 亚洲成av人片一区二区| 影音先锋制服丝袜| 国产精品123| 日本在线观看a| 国产精品精品| 女女同性女同一区二区三区91| 欧美激情不卡| 欧美亚洲国产精品| 日本欧美在线视频免费观看| 精品国产精品网麻豆系列| 欧美brazzers| 亚洲福利视频一区| 毛片久久久久久| 99麻豆久久久国产精品免费| 亚洲另类第一页| 99精品视频免费观看视频| 欧美 另类 交| 欧美人妖在线| 国产精成人品localhost| 欧美日韩国产网站| 97精品视频在线| 国产高清一区二区三区视频| 亚洲乱码国产乱码精品精| 性一交一乱一乱一视频| 欧美影视一区在线| 九九热在线视频播放| 亚洲啪啪综合av一区二区三区| 亚洲成人日韩在线| 成人在线一区二区三区| 亚洲娇小娇小娇小| 新67194成人永久网站| 亚洲色图都市激情| 久久中文字幕av| 青娱乐国产91| 欧美绝顶高潮抽搐喷水合集| 亚洲一区二区三区xxx视频| av成人免费看| 国产成人自拍视频在线观看| 999福利在线视频| 欧美大尺度激情区在线播放 | 久久久亚洲精品一区二区三区| 久久av一区二区三| 韩日欧美一区二区三区| 午夜在线观看av| 视频一区二区中文字幕| 日韩av黄色网址| 亚洲欧洲日本一区二区三区| 青青视频免费在线观看| 天天做天天爱天天综合网| 日韩av在线电影观看| 台湾色综合娱乐中文网| 精品国产综合久久| 狠狠一区二区三区| 操人视频欧美| 澳门久久精品| 国产综合动作在线观看| aaa国产精品视频| 99视频免费观看| 91九色鹿精品国产综合久久香蕉| 91精品中国老女人| 国产亚洲高清一区| 亚洲va男人天堂| 日本一区二区三区播放| 51国偷自产一区二区三区| 日韩一区网站| 国产精品福利视频| 狼人天天伊人久久| 欧美成人一区二区在线| 少妇一区二区视频| 日韩欧美在线一区二区| 91亚洲国产成人久久精品| 亚洲最大免费| 欧美激情性爽国产精品17p| 国内自拍中文字幕| 一本色道久久综合亚洲精品高清 | 久久久影院一区二区三区| 午夜欧洲一区| 亚洲欧美精品| 欧美成人国产| 日日摸日日碰夜夜爽无码| 亚洲欧美春色| www.99av.com| 国产在线精品一区二区三区不卡| 香蕉网在线视频| av一区二区三区四区| 最近中文字幕免费视频| 国产精品灌醉下药二区| 免费人成年激情视频在线观看| 偷拍一区二区三区| 欧美另类高清videos的特点| 欧美一区二区三区日韩| 五月婷婷狠狠干| 夜夜嗨av色一区二区不卡| 精品黄色免费中文电影在线播放| 九九热最新视频//这里只有精品| 2020av在线| 国产精品普通话| 一区二区日韩| 欧美一区二区在线视频观看| 91精品一区二区三区综合在线爱| 日本阿v视频在线观看| 天堂va蜜桃一区二区三区| 午夜精品免费看| av不卡免费在线观看| 天堂网av2018| 亚洲1区2区3区4区| 一道本在线视频| 亚洲国产日韩欧美在线99| 97在线观看免费观看高清 | 亚洲一卡二卡| 亚洲精品视频啊美女在线直播| www亚洲成人| 成人动漫视频在线| 亚洲不卡的av| 黄色成人av网| 国产精品老熟女视频一区二区| 亚洲国产91精品在线观看| 五月香视频在线观看| 久久久久久久国产精品| jizzyou欧美16| 国内精品**久久毛片app| 欧美一区亚洲| 三级a在线观看| 26uuu亚洲综合色欧美| 粉嫩av性色av蜜臀av网站| 一本大道久久精品懂色aⅴ| 亚洲风情第一页| 色婷婷综合久久久久| 电影天堂国产精品| 国产在线精品一区| 欧美大片一区| 久久久久xxxx| 国产日韩欧美激情| 久久久精品免费看| 精品剧情v国产在线观看在线| 欧美精品日韩少妇| 国产精品精品视频| 精品在线播放| 大陆极品少妇内射aaaaa| 国产成人小视频| www.av成人| 欧美男生操女生| 日本在线观看免费| 国产精品久久久久久五月尺| 蜜臀久久99精品久久一区二区| 国产一二三在线视频| 国产成人免费av在线| 国产1区2区3区4区| 欧美高清视频在线高清观看mv色露露十八| 毛片免费在线播放| 日本精品视频在线| 伊人成综合网yiren22| 老太脱裤让老头玩ⅹxxxx| 风间由美性色一区二区三区| 欧产日产国产v| 欧美一区二区三区喷汁尤物| 黄色av免费在线| 91久久久在线| 伊人青青综合网| 日本一二三区在线| 亚洲日本青草视频在线怡红院 | 视频一区二区三| 日韩国产欧美视频| 欧美aaa级片| 欧美日韩精品是欧美日韩精品| 成人免费视频| 国产在线不卡精品| 亚洲女同另类| 精品国产一二区| 亚洲成人手机在线| 外国精品视频在线观看 | theporn国产在线精品| 隔壁人妻偷人bd中字| av高清久久久| 天堂网视频在线| 中文字幕av一区二区三区谷原希美| 久久久加勒比| 亚洲精品天堂成人片av在线播放| 国产不卡一区视频| 国产污视频在线看| 亚洲欧美一区二区三区在线 | 欧美在线一区二区三区| 欧美性天天影视| 成人欧美一区二区三区黑人免费| 亚洲高清av| 亚洲区自拍偷拍| 欧美丰满少妇xxxxx高潮对白| 色av手机在线| 久久综合伊人77777麻豆| 日本不卡视频在线观看| 乱h高h女3p含苞待放| 精品av久久707| 国产成人精选| 精品少妇人欧美激情在线观看| 97超碰欧美中文字幕| 亚洲一区中文字幕在线| 欧美黑人一区二区三区| 你微笑时很美电视剧整集高清不卡| 美女少妇一区二区| 亚洲一区免费视频| 国产成人天天5g影院在线观看 | 精品一区亚洲| 6080国产精品| 欧美日韩在线免费| 欧美日韩视频在线播放| 精品蜜桃传媒| 久久99国产精品久久| 日本特黄一级片| 中文字幕欧美精品在线| 成人春色在线观看免费网站| 成年人在线观看视频免费| 亚洲一二三四区| 午夜免费播放观看在线视频| 国产一区二区自拍|