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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

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

發布時間:2025/3/15 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++笔记-異常處理機制(释放堆区空间) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近都在擼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++笔记-異常處理機制(释放堆区空间)的全部內容,希望文章能夠幫你解決所遇到的問題。

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