2010-06-16 3 views
1

C'est le code (juste une simplification d'un problème réel):Que se passe-t-il avec la mémoire lorsque je lance une exception?

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

Ceci est la sortie (PHP 5.3):

630680 
630848 

Qu'est-il arrivé à la mémoire (168 octets perdus)? L'objet d'exception n'est pas détruit? S'il vous plaît, aidez! Merci

+1

Sérieusement, pourquoi cela vous intéresse? ... Si vous voulez vraiment savoir, définissez des points d'arrêt pour les fonctions '_zend_mm_ *' et lancez votre script avec un débogueur attaché. – Artefacto

Répondre

0

L'objet d'exception est détruit. Ce qui est plus probable, c'est que vous avez la mise en mémoire tampon de sortie, et les 168 octets ajoutés proviennent du this is a test\n écho stocké dans le tampon. Une exception utilisera significativement plus de 168 octets (car elle stocke un backtrace, et d'autres informations).

+0

J'ai changé le code, il n'y a plus de sortie .. L'effet est le même :( – yegor256

+0

Essayez de faire echo memory_get_usage(). "\ N"; try {throw new Exception ('foo');} catch (Exception $ e) {echo memory_get_usage(). "\ N";} 'Cela peut être dû à d'autres informations internes (exécution, backtrace, etc.) Pourquoi est-ce que vous observez plus de 168 octets (je comprends d'un point de vue de curiosité, mais est-ce un gros problème de toute façon)? – ircmaxell

Questions connexes