※ ChatGPTを利用し、要約された質問です(原文:ヒープメモリの解放について)
ヒープメモリ解放の問題とは?
このQ&Aのポイント
VCを始めたばかりで、メモリ等の事が良くわかりません。
Invalid Address specified to RtlValidateHeapやHEAP: Free Heap block modified at after it was freedのメモリエラーが出力されます。
delete pBufが処理されていないと思います。記述等に問題があるのでしょうか?
すみません教えてください。
VCを始めたばかりで、メモリ等の事が良くわかりません。
(2)で、Invalid Address specified to RtlValidateHeap( 340000, 344978 )やHEAP: Free Heap block 344970 modified at 344998 after it was freed
のメモリエラーが出力されます。
調べてみると(1)で解放されていないのですが、delete pBufが処理されていないと思います。
記述等に問題があるのでしょうか? 調べてみると問題ないように思えるのですが・・・ ご存知の方教えてください。
<ソース>
HANDLE hEventLog = NULL;
EVENTLOGRECORD *pBuf = NULL;
/* イベントログのオープン処理 */
:
:
:
/* イベントログの最大数 */
bResult = GetNumberOfEventLogRecords(hEventLog, &EventNum);
//最大サイズを取得
BufSize = 1;
pBuf = new EVENTLOGRECORD;
bResult = ::ReadEventLog(hEventLog,EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ,0,pBuf,BufSize,&ReadBytes,&NextSize);
if(!bResult && GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
eMsg = "ファイルリードエラー2" ;
CloseEventLog(hEventLog);
delete pBuf;
return -1;
}
delete pBuf; --->(1)メモリが解放されない。
BufSize = NextSize;
bResult = ::ReadEventLog(hEventLog,EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ,0,pBuf,BufSize,&ReadBytes,&NextSize);
if(!bResult && GetLastError() != ERROR_INSUFFICIENT_BUFFER){
eMsg = "ファイルリードエラー3";
CloseEventLog(hEventLog);
delete pBuf;
return -1;
}
}
delete pBuf; --->(2)ここでエラー
補足
ご回答 ありがとうございます。 間違ってコメントアウトして記入忘れしていたのですが、 : : delete pBuf; ---------------------ここから2回目のREADEVENTLOG BufSize = NextSize; pBuf = new EVENTLOGRECORD; <-- 記述を忘れていました。 bResult = ::ReadEventLog (hEventLog,EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ,0,pBuf,BufSize,&ReadBytes,&NextSize); で、コンパイルしてみたところ、Heap block at 00344970 modified at 003449D8 past requested size of 60とでます。 これはヒープメモリがオーバーしたため足りない60サイズを要求しているって意味ですよね? だとすると、記載してあった char * pBuf2 = new char[NextSize]; pBuf = (LPEVENTLOGRECORD)pBuf2; で確保するのでしょうか? また、なぜchar型でメモリ領域を作成し、EVENTLOGRECORD型でpBufにキャストするのでしょうか? pBufはEVENTLOGRECORDですよね? 因みに(LPEVENTLOGRECORD)って(EVENTLOGRECORD)が正しいのですよね?(間違っていたらすみません。) コンパイルしても定義されていない見たいだし、MSDNで調べてもLPEVENTLOGRECORDが無かったものですから・・ たびたび聞いて申し訳ありません。