亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2324 | 回復(fù): 5
打印 上一主題 下一主題

異常對象是程序結(jié)束才被釋放????!!! [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2007-11-09 17:10 |只看該作者 |倒序瀏覽
原文見:
http://blog.csdn.net/mulinb/archive/2007/08/29/1763240.aspx
其中寫到:9)        throw出的對象稱為異常對象(exception object),由編譯器管理,catch接受到的對象如果不是引用或指針的話,則進(jìn)行對象拷貝。但是異常對象是程序結(jié)束才被釋放。

異常對象是程序結(jié)束才被釋放,這句話說錯了吧

論壇徽章:
0
2 [報告]
發(fā)表于 2007-11-09 17:22 |只看該作者
沒啥問題吧,那你覺得什么時候被釋放呢,自己寫個例子看看什么時候被析構(gòu)的吧

論壇徽章:
0
3 [報告]
發(fā)表于 2007-11-09 17:30 |只看該作者

我猜,

try的時候,保留所有寄存器狀態(tài),按照函數(shù)一層層調(diào)用,先后入棧;
可能所有catch都是當(dāng)作函數(shù)處理,就好象函數(shù)重載一樣,因異常不同而調(diào)用不同catch;
當(dāng)throw的時候,保存的寄存器狀態(tài)出棧,回復(fù)寄存器,那樣就能直接跳回到try,然后匹配catch;
如果沒有匹配到,保存的寄存器狀態(tài)出棧,……
直到有匹配的catch,如果沒有,就……

[ 本帖最后由 yuanchengjun 于 2007-11-9 17:33 編輯 ]

論壇徽章:
0
4 [報告]
發(fā)表于 2007-11-09 20:50 |只看該作者
樓上兩位,寫這么一個代碼,
如果異常對象要到程序結(jié)束才釋放,那么這個代碼立刻就能將內(nèi)存耗盡。顯然不是這樣的。

  1. struct exc
  2. {
  3.     int *p;
  4.     exc()
  5.     {
  6.         p = new int;
  7.     }
  8.     ~exc()
  9.     {
  10.         delete p;
  11.     }
  12. };


  13. while ( 1 )
  14. {
  15.      try
  16.      {
  17.           throw exc();
  18.      }
  19.      catch ( exc const &e )
  20.      {
  21.      }
  22. }
復(fù)制代碼

論壇徽章:
0
5 [報告]
發(fā)表于 2007-11-09 22:39 |只看該作者
  你都捕獲了,當(dāng)然釋放了

論壇徽章:
0
6 [報告]
發(fā)表于 2007-11-09 22:53 |只看該作者
顯然不是這樣的嘛,異常對象一旦被捕獲不再拋出,它就可以釋放了(也應(yīng)當(dāng)立即釋放,不能讓它占著坑吧,呵呵)

寫個測試代碼:

  1. #include <iostream>
  2. #include <exception>
  3. using namespace std;

  4. class MyException: public exception
  5. {
  6. public:
  7.     MyException() {
  8.         num = ++max;
  9.         cout << "Constructor " << num << endl;
  10.     }
  11.    
  12.     MyException(const MyException &) {
  13.         num = ++max;
  14.         cout << "Copy Constructor" << num << endl;
  15.     }
  16.    
  17.     ~MyException() throw() {
  18.         cout << "Destructor " << num << endl;
  19.     }
  20.    
  21.     static void* operator new (size_t size) {
  22.         cout << "new in MyException" << endl;
  23.         return ::operator new(size);
  24.     }
  25.    
  26.     static void operator delete (void* p) {
  27.         cout << "delete in MyException" << endl;
  28.         ::operator delete(p);
  29.     }
  30.    
  31. private:
  32.     static int max;
  33.     int num;
  34. };

  35. int MyException::max = 0;

  36. void func1()
  37. {
  38.     throw MyException();
  39. }

  40. void func2()
  41. {
  42.     func1();
  43. }

  44. void func3()
  45. {
  46.     func2();
  47. }

  48. void func4()
  49. {
  50.     try {
  51.         func3();
  52.     } catch (const MyException &e) {
  53.         throw;
  54.     }
  55. }

  56. int main()
  57. {
  58.     try {
  59.         func4();
  60.     } catch (MyException e) {
  61.     }
  62.    
  63.     char ch;
  64.     cin >> ch;
  65.    
  66.     return 0;
  67. }
復(fù)制代碼

運行結(jié)果:
Constructor 1
Copy Constructor2
Destructor 2
Destructor 1
q

Terminated with return code 0
Press any key to continue ...

由輸出可見,此編譯器實現(xiàn)(MinGW)可能是將異常對象分配在堆上,異常捕獲后如果不再拋出則釋放對象
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP