Salut à tous !
Je commence à suivre le tutoriel de Laurent Gomilla sur la réalisation d'un moteur 3D (pour voir à quoi ressemble un truc propre ), et je bute sur le premier chapitre concernant la gestion des fuites de mémoire.
En utilisant exactement le code fournis à la fin, j'arrive à faire fonctionner new :
1 2 3 4 5 6 7 8
| INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
{
int* p = new int;
//delete p;
return 0;
} |
... le gestionnaire de mémoire me signale bien la fuite.
En revanche, si j'un-comment le delete, le programme crash sur le new...
Je ne vois pas comment c'est possible. Comment une ligne peut être affectée par une autre qui est sensée s'exécuter après ?
Voilà à quoi ressemble le delete overloadé :
1 2 3 4
| inline void operator delete(void* Ptr)
{
Yes::CMemoryManager::Instance().Free(Ptr, false);
} |
Le pire, c'est que si je remplace le "delete p;" par "Yes::CMemoryManager::Instance().Free(p, false);" ça fonctionne !
C'est une fonction inline, le compilateur la remplace donc par son contenu lors de la compilation, je me trompe ? Le résultat doit donc être identique. C'est insensé...
Alors j'en viens à penser qu'il y a un problème de macro.
Voilà celle que j'utilise :
#define delete Yes::CMemoryManager::Instance().NextDelete(__FILE__, __LINE__), delete
Mais le problème persiste même quand je commente cette macro (faire un "#undef delete" ne change rien non plus). Ca n'est donc pas un problème de macro ?
Ou alors c'est du code qui fonctionne avec VC++ mais pas avec gcc ? (mais bon, ça compile...)
(à noter : le programme fonctionne parfaitement si j'utilise le delete original)
Partager