VC的std exception的問題

2021-08-30 02:10:52 字數 1143 閱讀 2154

我工作的工程裡現在**裡有這樣的使用方法:

class exception : public std::exception}; 

void throwfunc()

void main()

catch (const std::exception&e)

}

以這種方式使用實際上是沒有問題的,但是總感覺有點怪怪的。

問題的核心在於

std::exception(char const* const _message);

傳入的引數是乙個原始指標,這種指標並沒有規定其指向的物件的生命週期由誰管理,通常是由呼叫者管理,也就是誰申請誰釋放。

第一段**的用法也是這樣,但是上述建構函式有進行複製嗎?

explicit exception(char const* const _message) throw()

: _data()

; __std_exception_copy(&_initdata, &_data);

}

看起來 __std_exception_copy函式是複製資料的,但是我沒有查到相關文件,只能看實驗的結論了。

當然結論是確實複製了, __std_exception_data的另乙個成員名是_dofree,看來就是明確字串歸屬問題的。所以這個構造方法是可以保證資源的有效性,也能正確釋放。

但是exception還有另外乙個建構函式:

exception(char const* const _message, int) throw()

: _data()

就多了乙個匿名的int引數,看起來這個過載形式的意思就是只儲存一下指標,並不管理也不關心資源的問題。

當我剛看到這個函式時感覺非常奇怪:這個函式的目的是啥?為了省掉複製這個字串的時間?都拋異常了還在乎這點時間嗎?

但是就在寫這個文件時,突然想到複製字串除了需要時間,還需要空間。如果當前這個異常本身就是bad_alloc,那可能連容納這個字串的地方都沒有了,複製會失敗。所以這個形式還是有意義的。

ps:請思考當記憶體耗盡時如何正常地處理類似異常、寫日誌等任務?

ps:c++標準中std::exception只有乙個無參構造和複製構造。

VC 入門 步入VC 的殿堂

有時候需要用vc 來做乙個小軟體,但是對於沒用過的我,只能從新學習!曾今有人說過 視窗控制代碼 hwnd 來標示的,也就是說每乙個視窗都有乙個 視窗控制代碼,而且唯一,這個應該和分配記憶體有關的 當然 我們要對某個視窗進行操作,首先就要得到這個視窗的控制代碼。控制代碼 handle 是windows...

VC 呼叫libcurl的VC庫使用詳解

1.開發環境。我這裡環境是vc net 2003 windows xp sp3.不帶ssl的 http curl.haxx.se download libcurl 7.18.0 win32 msvc.zip 帶ssl的 http curl.haxx.se download libcurl 7.19....

VC字型顏色 VC助手

問題 1 書寫的 中部分關鍵字並沒有變成藍色,如int是藍色字型,但是cstring就不是藍色,而是黑色,請教高手這是什麼原因 2 在用vc 的mfc做一應用程式的時候,發現我的cpp檔案裡的程式源 全是黑色的,我以前編的時候都是彩色的呀,這下為什麼就變了呢?標頭檔案裡的原始碼卻都很正常 顏色有黑,...