如建構函式中丟擲異常的,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作為儲存引擎,並且不報錯也不警告,這樣...