Estouro de pilha devido à pilha de alocação / desalocação
-
07-07-2019 - |
Pergunta
EDIT: Apenas para tornar as coisas claras, este problema foi causado por um erro de digitação no meu código, em
pointer = new BYTE(datasize);
deveria ter sido
pointer = new BYTE[datasize];
Tudo bem!
END
Hi!
Eu estou tendo um problema de estouro de pilha estranho no Visual Studio 2005 em um C ++ projeto ..
No meu código, eu tenho um
BYTE* pointer;
Este ponteiro é definido como NULL, e em seguida alocado com alguma memória e, em seguida, liberado para 0x00. Como assim:
pointer = NULL;
pointer = new BYTE(dataSize);
memset(pointer,0x00,dataSize);
Agora, eu executar este algumas vezes, e obter dois resultados diferentes .. Às vezes (em uma parte posterior do programa, quando eu estou excluindo o ponteiro com delete []) diz que a pilha está danificada , e após a inspeção da pilha de chamadas parece que _CrtIsValidHeapPointer está afirmando que não é um ponteiro válido. No entanto eu verifiquei este ponteiro e parece ser válido para mim (ele tem um endereço de memória). Estou faltando alguma coisa?
No outro cenário, os congelamentos de aplicativos para um tempo muito curto, e eu recebo uma mensagem de estouro de pilha. Quando eu inspecionar a pilha de chamadas, parece que este
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
Há muitas dessas chamadas, e eu tenho certeza de que este está causando o estouro de pilha .. Qualquer idéia de que este problema poderia ser? Eu tentei olhar para ver se eu estou alocação / desalocação de errado, mas eu não tenho escrito para o bloco de memória que eu alocado além do memset ..
Existe errado algo com a maneira que eu estou alocação / desalocação de memória?
Eu estou usando este código para desalocar:
if (pointer != NULL){
delete[] pointer;
pointer = NULL;
}
Isso deve ter certeza que eu não estou liberando memória que já está liberado certo?
Obrigado ..
EDIT: na janela de saída, eu também estou recebendo uma tonelada destes:
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.
Solução
Eu acho que você quis dizer:
pointer = new BYTE[size];
Outras dicas
O seu código de alocação de deve ser:
if (pointer != NULL){
delete[] pointer;
pointer = NULL;
}