ヒープの割り当て/割り当て解除によるスタックオーバーフロー
-
07-07-2019 - |
質問
編集:わかりやすくするために、この問題はコードのタイプミスが原因で発生したため、
pointer = new BYTE(datasize);
すべきだった
pointer = new BYTE[datasize];
すべて順調です!
END
こんにちは!
C ++プロジェクトのVisual Studio 2005で奇妙なスタックオーバーフローの問題が発生しています。
コードには、
がありますBYTE* pointer;
このポインターはNULLに設定され、メモリが割り当てられてから0x00にクリアされます。そのように:
pointer = NULL;
pointer = new BYTE(dataSize);
memset(pointer,0x00,dataSize);
今、私はこれを数回実行し、2つの異なる結果を取得しました。時々(プログラムの後半で、delete []でポインターを削除するときに)ヒープが破損していると表示される、コールスタックを検査すると、_CrtIsValidHeapPointerが有効なポインターではないことをアサートしているように見えます。しかし、私はこのポインタをチェックしましたが、それは私には有効なようです(メモリアドレスがあります)何か不足していますか?
他のシナリオでは、アプリが非常に短時間フリーズし、スタックオーバーフローメッセージが表示されます。コールスタックを調べると、次のようになります
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
これらの呼び出しはたくさんありますが、これがスタックオーバーフローの原因であると確信しています。間違って割り当て/割り当て解除しているかどうかを確認しようとしましたが、memset以外に割り当てたメモリブロックには書き込みませんでした。
メモリの割り当て/割り当て解除の方法に何か問題がありますか?
このコードを使用して割り当てを解除しています:
if (pointer != NULL){
delete[] pointer;
pointer = NULL;
}
これにより、すでに正しく解放されているメモリを解放していないことを確認できますか?
ありがとう..
編集:出力ウィンドウでは、これらのトンも表示されます:
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.
解決
あなたの意図:
pointer = new BYTE[size];
他のヒント
割り当て解除コードは次のようになります。
if (pointer != NULL){
delete[] pointer;
pointer = NULL;
}