精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美日韩精品久久久免费观看| 亚洲片av在线| 成年人视频网站免费| 国内精品久久久久久久久久| 99在线|亚洲一区二区| 亚洲人成网站777色婷婷| 国产无遮挡猛进猛出免费软件| 中文字幕中文字幕在线中高清免费版 | 国产91欧美| 综合电影一区二区三区 | 亚洲欧美久久久久| av中文在线资源| 中文字幕巨乱亚洲| 岛国一区二区三区高清视频| 黄色污污视频软件| 欧美日韩亚洲一区二区三区在线| 亚洲精品中文字幕av| 午夜福利123| 日韩精品三区| 图片区小说区国产精品视频| 亚洲在线不卡| 国产一区电影| 99久久国产综合色|国产精品| 成人免费看吃奶视频网站| 成人午夜视频精品一区| 欧美~级网站不卡| 中文字幕日韩视频| 免费看污黄网站在线观看| 精品一区二区三区中文字幕视频| 欧洲国内综合视频| 黄色网页免费在线观看| 91三级在线| 综合久久国产九一剧情麻豆| 色综合久久av| 国产私人尤物无码不卡| 成人h动漫精品一区二区| 亚洲一区二区三区sesese| 制服丝袜在线一区| 日韩精品午夜视频| 日本午夜人人精品| 女人十八岁毛片| 91久久视频| 欧美极品欧美精品欧美视频| 久草综合在线视频| 1024精品久久久久久久久| 在线视频日韩精品| 久久亚洲无码视频| 精品日韩毛片| 最新69国产成人精品视频免费| 久久精品老司机| 欧美人妖视频| 亚洲精品日韩在线| 丰满少妇一区二区| 精品视频国产| 中文字幕日本欧美| 免费成人美女女在线观看| 色狮一区二区三区四区视频| 中文字幕亚洲无线码a| 国产精品视频在| 欧美第一精品| 久久成人精品视频| 草视频在线观看| 国产精品mm| 91福利视频网| 国产精品高清无码| 九九**精品视频免费播放| 国产精品一区二区在线| 92久久精品一区二区| 韩国理伦片一区二区三区在线播放| 成人www视频在线观看| 国产视频手机在线观看| 国产成人av电影免费在线观看| 国产精品久久久久久久久久久久冷 | 国产激情一区二区三区四区 | 男人的天堂在线| 久久久久久久久久久黄色| 日韩经典在线视频| 黄网站免费在线播放| 一区二区成人在线观看| 黄色免费视频大全| 热久久久久久| 亚洲精品在线一区二区| 国产又粗又猛又爽又黄av| 色婷婷色综合| 久久久久久久久国产| www.com国产| 久久99精品久久只有精品| 99在线影院| 韩国三级av在线免费观看| 中文字幕一区三区| www.av毛片| 成人国产精品| 亚洲国产精品免费| 一级二级黄色片| 在线综合视频| 91久久精品美女高潮| 亚洲欧美日韩免费| 亚洲欧洲精品成人久久奇米网| 丁香婷婷综合激情| 2019年精品视频自拍| 精品精品欲导航| 亚洲高潮女人毛茸茸| 国色天香一区二区| 国产精品成人一区| 图片区 小说区 区 亚洲五月| 日本一区二区三区视频视频| 国产成人生活片| 四虎4545www精品视频| 日韩三级av在线播放| 女女互磨互喷水高潮les呻吟 | 人妻久久久一区二区三区| 素人啪啪色综合| 日韩精品黄色网| 免费一级全黄少妇性色生活片| 久久一区中文字幕| 精品国产乱码久久久久久108| 日本中文字幕在线播放| 五月婷婷激情综合网| 婷婷激情综合五月天| 国内精品久久久久久99蜜桃| 欧美精品xxx| 99re只有精品| 1024成人网| 91国产精品视频在线观看| 欧美一性一交| 欧美激情在线播放| 国产v在线观看| 中文字幕日本不卡| 中文字幕在线导航| 奇米色欧美一区二区三区| 久久免费观看视频| 亚洲第一视频在线| 伊人色综合久久天天人手人婷| 15—17女人毛片| 精品国产一区二区三区四区| 26uuu亚洲伊人春色| 亚洲精品喷潮一区二区三区| √…a在线天堂一区| 亚洲 激情 在线| 北条麻妃国产九九九精品小说| 欧美在线一级视频| 青青草在线免费观看| 欧美日韩国产精品| 少妇大叫太粗太大爽一区二区| 亚洲麻豆一区| 精品在线视频一区二区| 黄色在线观看www| 欧美一卡二卡在线| 免费在线视频观看| 成人激情黄色小说| 欧美日韩成人免费视频| 日韩高清成人在线| 国产精品扒开腿做| 中文字幕在线视频区| 欧美日韩国产大片| 国产黄色的视频| 成人午夜看片网址| 亚洲国产精品影院| 久久久久久久久久久一区| 草草视频在线| 日韩经典中文字幕| 国语对白做受69按摩| 日本一区二区免费在线观看视频| 男女男精品视频站| 天天做天天爱天天综合网| 亚洲一区二区三区视频| 不卡av免费观看| 亚洲女同精品视频| 中文字幕免费播放| 一区二区三区在线视频免费| 久久久无码人妻精品无码| 99pao成人国产永久免费视频| 久久免费一区| 韩国精品视频在线观看| 欧美另类交人妖| 色偷偷在线观看| 欧美最猛性xxxxx直播| 青青操在线视频观看| 成人一区二区三区在线观看| 毛片在线视频播放| 成人嫩草影院| 国产欧美日韩综合精品| 午夜小视频在线观看| 亚洲精品成人久久电影| 真实新婚偷拍xxxxx| 一区二区三区精品在线观看| 一起草在线视频| 美女视频黄免费的久久| 国产又粗又猛又爽又黄的网站| 一本色道久久综合狠狠躁的番外| 国产日韩欧美一二三区| xxxcom在线观看| 中文字幕久热精品视频在线| www.色视频| 在线看国产一区| 久久久国产精华液| 国产欧美一区二区在线观看| 丰满少妇中文字幕| 视频一区二区国产| 亚洲国产一二三精品无码| 九九久久精品| 国产91色在线|亚洲| 日本欧美韩国| 亚州av一区二区| 国产激情视频在线| 亚洲男女性事视频| www精品国产| 欧美日韩三级视频| 天天干天天干天天操| 亚洲精品一二三| 日韩欧美黄色网址| 久久综合久久综合久久| 欧美日韩一区二区区| 久久精品成人| 成 年 人 黄 色 大 片大 全| 国产精品久久久久久久免费观看 | 欧美日韩激情视频一区二区三区| 欧美一区二区三区播放老司机| 中文字幕免费观看| 亚洲成人av一区| 九九视频在线免费观看| 国产精品传媒入口麻豆| 小早川怜子久久精品中文字幕| 成人18视频日本| 秋霞午夜鲁丝一区二区| 精品制服美女丁香| 天天插天天操天天射| 羞羞视频在线观看欧美| 东北少妇不带套对白| 欧美久久一级| 国产成人艳妇aa视频在线| 午夜免费一区| 在线观看免费黄色片| 成人羞羞网站| 亚洲电影免费| 成人av动漫在线观看| 欧美午夜免费| 手机在线免费看片| 久久精品国产一区二区| 色一情一乱一伦一区二区三区日本| 日韩午夜激情| 免费看又黄又无码的网站| 亚洲福利精品| 国产96在线 | 亚洲| 99精品视频免费观看视频| www.av蜜桃| 在线亚洲欧美| 精品久久久久久久无码 | 日韩欧美伦理| 在线观看国产一区| 婷婷亚洲综合| 白白操在线视频| 影音国产精品| 欧美亚洲一二三区| 男女男精品视频网| 在线观看国产一级片| 韩国三级电影一区二区| 深夜视频在线观看| 成人app下载| a级片在线观看| **性色生活片久久毛片| 精品99久久久久成人网站免费| 亚洲一区二区视频在线| 久久高清免费视频| 91福利在线免费观看| 中文字幕视频二区| 日韩欧美国产精品一区| 色噜噜在线播放| 夜夜躁日日躁狠狠久久88av| √天堂资源地址在线官网| 欧美伦理91i| 亚洲天堂手机| 91欧美激情另类亚洲| 中文字幕视频精品一区二区三区| 精品一区在线播放| 久久精品国产www456c0m| 免费看黄色a级片| 一区二区三区国产盗摄| 国产喷水theporn| 国产成人超碰人人澡人人澡| 国产又爽又黄无码无遮挡在线观看| 国产欧美1区2区3区| 免费在线黄色片| 在线观看亚洲精品| 丰满肉嫩西川结衣av| 亚洲人成在线电影| 色综合999| 国产精品久久婷婷六月丁香| 久久久91麻豆精品国产一区| 久久香蕉综合色| 久久久久久美女精品| 日本一区二区黄色| 国产一区二区91| 免费看污片网站| 亚洲综合一区二区| 中文字幕欧美人妻精品一区蜜臀| 欧美xxxxxxxx| 91xxx在线观看| 51精品在线观看| 麻豆精品一区| 亚洲欧洲日夜超级视频| 在线 亚洲欧美在线综合一区| 少妇激情一区二区三区| 成人免费毛片嘿嘿连载视频| 五月婷婷婷婷婷| 精品露脸国产偷人在视频| 99热这里只有精品在线| 亚洲一区二区国产| 女人让男人操自己视频在线观看| 成人福利在线视频| 精品美女久久| 日韩网址在线观看| 不卡一区中文字幕| www.99re7| 制服丝袜亚洲播放| 99se视频在线观看| 日韩av片永久免费网站| 加勒比中文字幕精品| 精品国产三级a∨在线| 日本中文一区二区三区| 波多野结衣办公室33分钟| 亚洲国产另类av| xxxx18国产| 欧美裸身视频免费观看| 97久久中文字幕| 亚洲区一区二区三区| 日日欢夜夜爽一区| aaaaa一级片| 岛国av一区二区| 神马午夜精品95| 97免费在线视频| 欧洲精品一区| 成人免费在线小视频| 成人av先锋影音| 日干夜干天天干| 亚洲第一区第二区| 91视频欧美| 国产欧美精品一区二区三区| 午夜久久一区| 久久久久亚洲av无码网站| 亚洲精品视频在线| 国内毛片毛片毛片毛片| 久久99精品久久久久久青青91| 亚洲精品三区| 热久久最新地址| 成人一区二区在线观看| 日韩三级免费看| 日韩精品极品在线观看| 高清不卡亚洲| 日韩高清国产精品| 麻豆91在线观看| 国产又黄又爽又无遮挡| 日韩欧美国产wwwww| 伦理在线一区| 久久久久久久久久久久久久久久av| 免费看黄裸体一级大秀欧美| 亚洲人成人无码网www国产| 欧洲精品一区二区三区在线观看| 最新电影电视剧在线观看免费观看 | 国产91av视频| 日韩精品在线影院| 成人在线视频观看| 大桥未久一区二区三区| 国产成人免费在线观看不卡| 国产精品1234区| 亚洲欧美国产制服动漫| 成人mm视频在线观看| 欧美少妇一区二区三区| 成人av免费在线| 国产99久久久久久免费看| 日韩在线视频国产| 2021年精品国产福利在线| 免费无遮挡无码永久视频| 欧美激情在线看| 性少妇videosexfreexxx片| 91tv亚洲精品香蕉国产一区7ujn| 精品日本12videosex| 国产xxx在线观看| 色94色欧美sute亚洲13| 黄网址在线观看| 精品国产乱码久久久久久88av| 欧美aaaaa成人免费观看视频| 国产av无码专区亚洲av毛网站| 亚洲国语精品自产拍在线观看| **在线精品| 国产成人免费高清视频| 99久久99久久精品免费观看| 中文字幕免费高清在线观看| 欧美国产第一页| 日韩理论电影院| 麻豆国产精品一区| 欧美精品乱人伦久久久久久| 国产激情在线播放| 免费看av软件| 国产午夜精品在线观看| 免费观看成年人视频| 国产在线高清精品| 久久不射网站| 欧美日韩成人免费观看| 在线播放日韩精品|