2010-06-16 107 views
1

這是代碼(只是一個現實的問題簡單化):當我拋出一個異常時,內存發生了什麼?

<?php 
echo memory_get_usage() . "\n"; 
function f() { 
    throw new Exception(); 
} 
function foo() { 
    try { 
     f(); 
    } catch (Exception $e) { 
    } 
} 
foo(); 
echo memory_get_usage() . "\n"; 

這是輸出(PHP 5.3):

630680 
630848 

與什麼發生了內存(168個字節丟失)?異常對象不被破壞?請幫忙!謝謝

+1

嚴重的是,你爲什麼在意?......如果你真的想知道,爲'_zend_mm_ *'函數設置斷點並用附加的調試器運行你的腳本。 – Artefacto 2010-06-16 17:51:14

回答

0

異常對象被銷燬。更有可能的是,您有輸出緩衝,並且添加的168個字節來自存儲在緩衝區中的回顯this is a test\n。一個例外會使用大大超過168字節(因爲它存儲回溯和其他信息)。

+0

我已經改變了代碼,沒有輸出了。效果是一樣的:( – yegor256 2010-06-16 17:46:06

+0

嘗試做'echo memory_get_usage()。「\ n」; try {throw new Exception('foo');} catch (Exception e){echo memory_get_usage()。「\ n」;}'這可能是因爲其他內部信息(運行時間,回溯等)爲什麼你煩惱超過168字節(我從好奇心的角度理解,但這是一個很大的交易)? – ircmaxell 2010-06-16 17:48:29

相關問題