亚洲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貼的那段代碼就會煩死鳥挖,改成這樣就能少煩一點了:

  1. class test
  2. {
  3. public:
  4.     test(uint32_t num)
  5.     {
  6.         if (num ==0) {
  7.             //如果輸入為0 怎么辦?
  8.             throw(...);
  9.         }
  10.         m_pdata.reset(new int[num]);
  11.     }
  12. private:
  13.     std::unique_ptr<int[]> m_pdata;
  14. }
復制代碼
由于new能正確處理0長度數(shù)組,所以程序可以簡化成這樣:

  1.     test(uint32_t num) : m_pdata(new int[num]) {
  2.         // ...
  3.     }
復制代碼
如果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