C 異常使用總結(持續更新)

2021-06-17 17:04:22 字數 1302 閱讀 8693

如建構函式中丟擲異常的,c++的異常機制是不會去呼叫它的析構函式的。這個問題會造成一些記憶體洩露的問題。

看一下這個例子:

class cspace

~cspace()

private:

int *m_pspace;

//...

public:

//...

};void render()

catch(cexception* e)

}

這裡cspace的建構函式在位m_pspace申請完空間後,丟擲異常,那麼在render函式進行異常處理。這個時候因為系統認為cspace物件還沒構造好,就不去呼叫它的析構函式。所以麻煩來了,誰去處理m_pspace呢?這個成為了有乙個被遺棄的指標,永遠不會被釋放。

還好這個問題完全可以從設計上去解決。

我們可以使用init和release之類的函式。還是直接看**。

class cspace

~cspace()

private:

int *m_pspace;

//...

public:

void init()

voidrelease()

//...

};

原本來說建構函式就只是負責一些變數的賦初值工作

丟擲捕獲的異常,應該用什麼型別比較好。看了一些資料,還是感覺引用是最不錯的。

這裡應該也就三種情況:

1.     catch(exceptionex) ,這個主要是每次catch都要拷貝一次,這個提高了catch的代價;

2.     catch(exception* ex),這個最大缺陷,也是指標的通病,你要怎麼去處理這個異常指標,要不要delete這個指標;

主要是要試想一下,如果這個異常物件是存在於堆裡的話,你在這裡delete掉,肯能導致其它地方再次使用時,會帶來很大的麻煩。

3.     catch(exception& ex),這個既解決了拷貝的代價,也不必再去考慮釋放異常物件。

上面三種情況,就知道使用引用處理異常的捕獲是最好的選擇。

這個是比較麻煩,因為這裡catch的型別都是指標型的,需要你自己去呼叫cexception中的delete函式來進行釋放。

當然用try catch巨集的話,就不用手動去呼叫delete函式了。

在vs中如果選擇/eha編譯選項的話,可以用catch捕獲到一些不是throw的異常,甚至連access violations也能捕獲到。可以看官網中的介紹。

會持續更新,如果有了新發現……

Git使用總結(持續更新)

git是分布式版本控制工具,在雲端有乙個遠端庫,用於 共享,方便團隊合作開發。每個人都可以 從遠端 庫拉取 到本地倉庫,然後在本地拉取分支或者進行各種功能開發 bug修復等工作。常用git命令 參考 廖雪峰的git教程 配了個新筆記本,要重新配置git,記錄一下遇到的坑 1.首先要在新筆記本上安裝g...

總結持續更新

1 從屬關係的區別 link屬於xhtml標籤,而 import是css提供的語法規則,link除了載入css,還可以定義rss,定義rel連線屬性等,import就只能載入css。2 載入順序的區別 頁面載入時,link會同時被載入,而 import引用的css會等頁面被載入完後再載入。3 相容性...

MySQL使用總結 持續更新中

本文目的 使用mysql遇到並解決了一些問題,在這裡記錄與分享。問題1 linux源 安裝mysql時,預設不安裝innodb儲存引擎,需要手動安裝 如果忘記手動安裝innodb,那麼任何表建立時,如果儲存引擎指定為innodb,mysql會預設選擇myisam作為儲存引擎,並且不報錯也不警告,這樣...