4 votes

Erreurs de compilation lorsque j'utilise la détection des fuites de mémoire du CRT

Pour détecter les fuites de mémoire, un nouveau mot-clé est redéfini. C'est OK si j'utilise [Type 1]. Mais une erreur de compilation se produit si je décommente [Type 2]. Existe-t-il un moyen d'utiliser les deux types de new ?

#include <crtdbg.h>

#define new new(_CLIENT_BLOCK, __FILE__, __LINE__)

struct Foo
{
 int m_N;
 Foo() : m_N( 0 ) {}
};

int main( int argc, char* argv[] )
{
 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
 _CrtSetReportMode(_CRT_WARN , _CRTDBG_MODE_FILE);
 _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);

 int* pI = new int( 1 ); 
 delete pI;

 Foo* pFoo = new Foo;    // [Type 1]
 //Foo* pFoo2 = new (pFoo) Foo(); // [Type 2]

 return 0;
}

2voto

Alex Budovski Points 8932

Parce que votre macro provoque l'expansion de votre nouveau placement :

Foo* pFoo2 = new(_CLIENT_BLOCK, __FILE__, __LINE__) (pFoo) Foo();

ce qui est clairement une syntaxe invalide.

Un ingénieur de MSFT confirme :

#define du nouveau n'est pas compatible avec le placement du nouveau

donc vous ne pouvez pas l'utiliser avec crtdbg.h .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X