最近都在擼Java代碼,身爲C++程序員,看到java中異常機制,非常的香,看看以前的C++項目,對異常寫的不是很多,看看公司大佬們C++代碼,對異常處理也不多。在此,我自己總結下,方便以後在C++代碼中,多用異常處理機制,使得程序健壯性有所提升。

此博文最關鍵的是使用智能指針,接管堆區對象,實現自動的釋放。

1. 編碼時的防錯方法;

2. 程序異常機制的處理方法;

3. 異常發生時内存管理方法。

編碼時的防錯:

使用斷言:assert(表達式)

在重新運行時的錯誤。

斷言只存在于Debug版的程序。

代碼如下:

#include <iostream>
#include <cassert>
using namespace std;int myDiv(int num1, int num2) {int ret = num1 / num2;return ret;
}int main(int argc, int *argv[]) {cout << myDiv(10, 0) << endl;getchar();return 0;
}

儅num2輸入0時

下面使用斷言來試試看

#include <iostream>
#include <cassert>
using namespace std;int myDiv(int num1, int num2) {assert(num2 != 0);int ret = num1 / num2;return ret;
}int main(int argc, int *argv[]) {cout << myDiv(10, 0) << endl;getchar();return 0;
}

num2不爲0時就往下走

從中可以看出,挺友好的。

下面是使用abort()函數或exit()函數進行編碼時的防錯。

返回錯誤標志:返回bool類型,返回int類型。

注意:abort()存在于cstdlib頭文件中

#include <iostream>
#include <cstdlib>
using namespace std;int main(int argc, int *argv[]) {int x;int y;cout << "please input tow number: ";cin >> x >> y;if (y == 0) {cout << "error: y is 0" << endl;abort();}else {cout << "The result is " << x / y << endl;}getchar();getchar();return 0;
}

正常輸入:

錯誤輸入:

這裏exit()就不再演示了。

下面是最重要的一點:異常機制。

使用try塊,異常發生時,使用throw抛出,使用catch塊捕獲異常。

如下,正常的代碼:

#include <iostream>
#include <cmath>
using namespace std;double calc(int para) {if (para < 0) {throw "error, The para < 0";}return sqrt(para);
}int main(int argc, int *argv[]) {double ret = -1.0;try {ret = calc(20);}catch (const char *e) {cout << e << endl;}cout << "The result is : " << ret << endl;getchar();return 0;
}

運行截圖如下:

儅輸入小於0的值后:

這樣通過異常機制,程序就不會崩潰了

這裏,對比下java,java的異常有throw,try,catch,finally。這個finally很是重要,如果有加鎖,在這個地方可以解鎖。

在C++中,就沒這麽好運了,沒有finally。但有些優秀的框架,比如Qt,在異常加鎖,解鎖上,都有很好的處理,在此,不再研究加鎖,和解鎖,這一塊。

目前考慮如下:在try中new的東西,如何去釋放!!!!

異常發生時的内存管理:

堆棧解退:如果函數因爲異常而終止,從throw到try之間所有局部變量都會自動撤銷,類對象的析構函數也會被執行。

如下代碼:

#include <iostream>
using namespace std;class MyClass {public:int num;MyClass(int n) {num = n;}~MyClass() {cout << "~MyClass() called! The num is : " << num << endl;}
};int main(int argc, int *argv[]) {try {MyClass m(1);MyClass *my2 = new MyClass(2);throw "error";}catch (const char *e) {cout << e << endl;}getchar();return 0;
}

運行截圖如下:

從中可以看到那個new出來的指針並沒有被釋放。

代碼修改如下:

#include <iostream>
#include <memory>
using namespace std;class MyClass {public:int num;MyClass(int n) {num = n;}~MyClass() {cout << "~MyClass() called! The num is : " << num << endl;}
};int main(int argc, int *argv[]) {try {MyClass m(1);MyClass *my2 = new MyClass(2);unique_ptr<MyClass> uniMy2Ptr(my2);       //方便自動釋放throw "error";}catch (const char *e) {cout << e << endl;}getchar();return 0;
}

使用智能指針去接管,讓其制動釋放:

出現運行截圖如下:

C++笔记-異常處理機制(释放堆区空间)相关推荐

  1. C语言学习笔记——堆区空间申请(一)

    C语言学习笔记 堆区空间申请(一) 栈区变量分析 所有程序/软件的运行,都是由操作系统统一调配的,操作系统是程序的运行环境 运行中的多个程序之间,内存是不交叉的 程序结束后,操作系统还要释放其使用的资 ...

  2. C++工作笔记-作用域的巧妙使用,释放堆区创建的资源

    比如: 要做一个接口,API,函数给别人用, 放回一堆数据给了那个指针,那么,这个new出的东西,是谁来释放!!!!! 解决方法:可以在定义一个类,接口,函数,用于释放,并使用了作用域,和类的特点, ...

  3. 深入理解 Linux 2.6 的 initramfs 機制 (上)

    转自 http://blog.linux.org.tw/~jserv/archives/001954.html 日前結束一個消費性電子產品的開發工作,稍有心得,試著整理採取 Linux kernel ...

  4. 線陣相機處理時間計算方法

    線陣相機圖像處理時間計算,以xx案子為例, 相機使用16K線陣 最大速度300mm/s FOV 300mm 計算方法: 1,            每個像素點大小=FOV/像素數=300/16*100 ...

  5. c语言gps数据处理 6分,程序設計入門——C語言 第8周編程練習 2GPS數據處理(6分)...

    題目內容: NMEA-0183協議是為了在不同的GPS(全球定位系統)導航設備中建立統一的BTCM(海事無線電技術委員會)標准,由美國國家海洋電子協會(NMEA-The National Marine ...

  6. 文字處理經驗談(字符集,字体,输入法)

    文字處理經驗談 一.如何處理無法輸入電腦的漢字 一些漢字無法輸入電腦,一般不外乎以下二種情況:一是電腦操作系統所支持的字符集及其相應支持字體的問題,一是輸入法的問題. (一) 編碼字符集.字體.輸入法 ...

  7. mysql 开启 thread pool_MySQL線程池(THREAD POOL)的處理

    背景介紹 MySQL常用(目前線上使用)的線程調度方式是one-thread-per-connection(每連接一個線程),server為每一個連接創建一個線程來服務,連接斷開后,這個線程進入thr ...

  8. XMD RAC(Oracle 9i) 存儲修復處理

    處理技朮﹕ [root@DELL-RAC02 root]# powermt display dev=all Pseudo name=emcpoweri CLARiiON ID=CK2000407000 ...

  9. android fence机制,Android中的GraphicBuffer同步機制-Fence

    http://blog.csdn.net/jinzhuojun/article/details/39698317 Fence是一種同步機制,在Android里主要用於圖形系統中GraphicBuffe ...

最新文章

  1. Caffe实践】如何利用Caffe训练ImageNet分类网络
  2. python数组用sum求和_对python中array.sum(axis=?)的用法介绍
  3. 读书笔记_代码大全2第十章_变量初始化
  4. 完整的目标管理三段俱全
  5. LeetCode题库整理【Java】—— 3 无重复字符的最长子串
  6. unity怎么bake地形上的植被_“烧烤”是quot;barbecuequot;,那“烤串”的英语怎么说?一定要看看!...
  7. html设置缩放级别,自定义页面缩放「Custom Page Zoom」
  8. JS保证输入框里面的数值是数字
  9. 巩固有私有VLAN和VLAN访问控制列表的网络
  10. DCMTK开发笔记(一):我的第一个DCMTK demo
  11. 信息技术导论——信息和信息系统习题整理
  12. 怎么更改计算机上的限制应用,图文详解通过修改win10系统组策略实现限制指定应用程序的运行-系统操作与应用 -亦是美网络...
  13. Scintilla教程(5): 选中
  14. Ubuntu使用ZTE MF832S上网卡拨号上网
  15. 如何根据公司名称来筛选快递
  16. WPF 海康威视网络摄像头回调方式实现断连提示,降低时延
  17. 小马哥----高仿三星note3 n9002 9006主板型号A202 刷机后修复返回键失灵实例说明
  18. Promise.resolve几种情况
  19. 【史上最全App开发知识分享】如何从零开始成为app开发专家?
  20. 怎么把ubuntu系统从英文修改为中文界面

热门文章

  1. 轻松搞定 Nginx 配置的好工具!
  2. 一企业靠数据中台打通SAP、ERP系统,还能做出可视化分析
  3. 小证明题 编译原理--题目原型:
  4. 飞秋2010下载又用什么样的技术
  5. [精华] 讨论 Setsockopt选项
  6. IPv6名称到地址的转换函数getaddrinfo()详解
  7. C语言嵌入式系统编程修炼之内存操作
  8. 程序员,这600单词你知道吗?
  9. 如何用10万资金炒房到1000万
  10. HTML5 API详解(9):大家都知道的 localStorage 本地存储