亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標題:
c++構造函數(shù)要try catch 還是直接throw
[打印本頁]
作者:
kdkgod
時間:
2015-11-13 10:38
標題:
c++構造函數(shù)要try catch 還是直接throw
有個問題比較疑惑,現(xiàn)有個類
class test
{
public:
test(uint32_t num) {
if (num ==0) {
//如果輸入為0 怎么辦?
}
m_pdata = new int[num];
//如果new失敗怎么辦?
}
private:
int *m_pdata;
}
大牛支招
作者:
hellioncu
時間:
2015-11-13 11:03
拋異常就不會調用析構了,如果沒事就拋吧;如果后續(xù)可以判斷未初始化好就catch住吧。
建議增加一個初始化函數(shù)更好些。
作者:
windoze
時間:
2015-11-13 16:29
本帖最后由 windoze 于 2015-11-13 16:35 編輯
構造函數(shù)里拋異常會讓你有一個半截子對象,而且也不會調用這個對象的析構函數(shù)。
但是
每個數(shù)據(jù)成員的析構函數(shù)都會被調!
但是
每個數(shù)據(jù)成員的析構函數(shù)都會被調!
但是
每個數(shù)據(jù)成員的析構函數(shù)都會被調!
重要的事情說三遍!
也就是說,只要你保證對象里的每個數(shù)據(jù)成員都符合RAII的要求,就不會有資源泄漏。
比如說你的對象里有一個unique_ptr,那么如果你在構造函數(shù)里拋出了異常,這個unique_ptr會正確的處理這種情況,如果它此時已經(jīng)構造好,指向一個有效的對象,那么這個對象會析構,否則就什么也不做。
這個故事告訴我們,不要使用裸指針管理資源,像lz貼的那段代碼就會煩死鳥挖,改成這樣就能少煩一點了:
class test
{
public:
test(uint32_t num)
{
if (num ==0) {
//如果輸入為0 怎么辦?
throw(...);
}
m_pdata.reset(new int[num]);
}
private:
std::unique_ptr<int[]> m_pdata;
}
復制代碼
由于new能正確處理0長度數(shù)組,所以程序可以簡化成這樣:
test(uint32_t num) : m_pdata(new int[num]) {
// ...
}
復制代碼
如果new失敗什么事也不會有
作者:
kdkgod
時間:
2015-11-13 16:32
使用裸指針管理資源, 怎么理解?!
回復
3#
windoze
作者:
kdkgod
時間:
2015-11-13 16:36
我理解你的意思了,但是我們基于redhat6.3做的開發(fā),我也想用智能指針,但是redhat6.3的gcc不支持c++11.
回復
3#
windoze
作者:
kdkgod
時間:
2015-11-13 16:38
我覺得二樓的提供的辦法最好,也是我最常用的,加個初始化函數(shù).
回復
3#
windoze
作者:
windoze
時間:
2015-11-13 16:42
回復
5#
kdkgod
老版本的GCC可以用boost.smart_ptr里面的scoped_ptr湊合一下,在這個場合沒什么區(qū)別。
作者:
windoze
時間:
2015-11-13 16:45
回復
6#
kdkgod
不過話說回來,你干嗎不用vector<int>?這個再老版本的C++也該有了。
作者:
kdkgod
時間:
2015-11-13 16:54
歷史原因,
我實現(xiàn)了一個基于數(shù)組的無鎖的緩沖區(qū)模板類. 數(shù)組的size是用過template傳,但是這樣編譯之后就指定了數(shù)組的大小,為了以后能通過配置文件靈活改變緩沖區(qū)大小,所以才這樣的方式傳數(shù)組的大小.
回復
8#
windoze
歡迎光臨 Chinaunix (http://72891.cn/)
Powered by Discuz! X3.2