1

EDIT: Juste pour rendre les choses claires, ce problème a été causé par une faute de frappe dans mon code, dansdébordement de pile en raison de l'allocation tas/désallocation

pointer = new BYTE(datasize); 

aurait dû être

pointer = new BYTE[datasize]; 

Tout va bien!

FIN

Salut!

Je vais avoir un problème bizarre de débordement de pile dans Visual Studio 2005 dans un projet C++ ..

Dans mon code, j'ai une

BYTE* pointer; 

Ce pointeur est NULL, puis alloué avec un peu de mémoire, puis effacé à 0x00. Comme si:

pointer = NULL; 
pointer = new BYTE(dataSize); 
memset(pointer,0x00,dataSize); 

Maintenant, j'ai couru à quelques reprises, et obtenir deux résultats différents .. Parfois (dans une partie ultérieure du programme, quand je supprime le pointeur avec suppression []) il indique que le tas est corrompu, et lors de l'inspection de la pile d'appels, il semble que _CrtIsValidHeapPointer affirme qu'il ne s'agit pas d'un pointeur valide. Cependant j'ai vérifié ce pointeur et il me semble être valide (il a une adresse mémoire). Est-ce que je manque quelque chose?

Dans l'autre scénario, l'application se fige pendant très peu de temps et j'obtiens un message de débordement de pile. Lorsque j'inspecte la pile d'appel, il ressemble à ce

something.dll!_heap_alloc_base(unsigned int size=568) Line 105 + 0x28 bytes C 
something.dll!_heap_alloc_dbg(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608) Line 411 + 0x9 bytes C++ 
something.dll!_nh_malloc_dbg(unsigned int nSize=532, int nhFlag=0, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608) Line 268 + 0x15 bytes C++ 
something.dll!_malloc_dbg(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608) Line 191 + 0x1b bytes C++ 
something.dll!_calloc_dbg(unsigned int nNum=1, unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608) Line 563 + 0x15 bytes C++ 
something.dll!_getptd_noexit() Line 608 + 0x18 bytes C 
something.dll!_errno() Line 281 + 0x5 bytes C 
something.dll!_heap_alloc_dbg(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608) Line 415 + 0x5 bytes C++ 
something.dll!_nh_malloc_dbg(unsigned int nSize=532, int nhFlag=0, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608) Line 268 + 0x15 bytes C++ 
something.dll!_malloc_dbg(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608) Line 191 + 0x1b bytes C++ 
something.dll!_calloc_dbg(unsigned int nNum=1, unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608) Line 563 + 0x15 bytes C++ 
something.dll!_getptd_noexit() Line 608 + 0x18 bytes C 
something.dll!_errno() Line 281 + 0x5 bytes C 
something.dll!_heap_alloc_dbg(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608) Line 415 + 0x5 bytes C++ 
something.dll!_nh_malloc_dbg(unsigned int nSize=532, int nhFlag=0, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608) Line 268 + 0x15 bytes C++ 
something.dll!_malloc_dbg(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608) Line 191 + 0x1b bytes C++ 
something.dll!_calloc_dbg(unsigned int nNum=1, unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608) Line 563 + 0x15 bytes C++ 
something.dll!_getptd_noexit() Line 608 + 0x18 bytes C 
something.dll!_errno() Line 281 + 0x5 bytes C 
something.dll!_heap_alloc_dbg(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608) Line 415 + 0x5 bytes C++ 
something.dll!_nh_malloc_dbg(unsigned int nSize=532, int nhFlag=0, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608) Line 268 + 0x15 bytes C++ 
something.dll!_malloc_dbg(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608) Line 191 + 0x1b bytes C++ 
something.dll!_calloc_dbg(unsigned int nNum=1, unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x0627fec8, int nLine=608) Line 563 + 0x15 bytes C++ 
something.dll!_getptd_noexit() Line 608 + 0x18 bytes C 
something.dll!_errno() Line 281 + 0x5 bytes C 

Il y a beaucoup de ces appels, et je suis assez certain que cela cause du débordement de la pile .. Toute idée de ce que ce problème pourrait être? J'ai essayé de voir si j'alloue/libère mal, mais je n'ai pas écrit dans le bloc de mémoire que j'ai affecté en dehors du memset.

Y at-il quelque chose qui ne va pas dans la façon dont j'alloue/désallouer la mémoire?

Je suis en utilisant ce code à désaffecter:

if (pointer != NULL){ 
    delete[] pointer; 
    pointer = NULL; 
} 

Cela devrait assurer que je ne suis pas libérer de la mémoire qui est déjà libéré droit?

Merci ..

EDIT: Dans la fenêtre de sortie, je me fais aussi une TONNE de ces derniers:

First-chance exception at 0x76df0839 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8. 
First-chance exception at 0x76e2871f in app.exe: 0xC0000005: Access violation reading location 0x00000004. 
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8. 
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8. 
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8. 
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8. 
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8. 
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8. 
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8. 
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8. 
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8. 
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8. 
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8. 
First-chance exception at 0x76e00a65 in app.exe: 0xC0000005: Access violation reading location 0xfffffff8. 

Répondre

6

Je pense que vous vouliez dire:

pointer = new BYTE[size]; 
+0

OH SNAP! J'AI ALLOUÉ AVEC BYTE (taille) au lieu de BYTE [TAILLE] !! Que je suis bête!!! – krebstar

+0

DAMN MERCI À L'HOMME !!!J'ai passé une journée entière et j'ai continué à le faire !!! – krebstar

+0

Oh, je comprends bien, 'new byte (size)' et 'new byte [size]' alloueront la même quantité de mémoire mais vous aurez ** à 'supprimer 'le premier et' delete [] 'ce dernier. –

0

Votre le code de désaffectation devrait être:

if (pointer != NULL){ 
    delete[] pointer; 
    pointer = NULL; 
} 
+0

Non, le test NULL est inutile. –

+0

est-il autorisé de libérer (ou essayer de libérer) un pointeur NULL? – krebstar

+0

Ouais, je répondais juste à une faute de frappe dans l'OP :)) –

Questions connexes