- ベストアンサー
ヒープメモリ解放の問題とは?
- VCを始めたばかりで、メモリ等の事が良くわかりません。
- Invalid Address specified to RtlValidateHeapやHEAP: Free Heap block modified at after it was freedのメモリエラーが出力されます。
- delete pBufが処理されていないと思います。記述等に問題があるのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ちょっと順番が前後しますが、 >コンパイルしても定義されていない見たいだし、MSDNで調べてもLPEVENTLOGRECORDが無かったものですから・・ すみません。PEVENTLOGRECORDの間違いですね。 EVENTLOGRECORD*のことです。 という前提で、 >これはヒープメモリがオーバーしたため足りない60サイズを要求しているって意味ですよね? そうです。 >だとすると、記載してあった >char * pBuf2 = new char[NextSize]; >pBuf = (LPEVENTLOGRECORD)pBuf2; >で確保するのでしょうか? そうなります。 >また、なぜchar型でメモリ領域を作成し、 >EVENTLOGRECORD型でpBufにキャストするのでしょうか? >pBufはEVENTLOGRECORDですよね? new EVENTLOGRECORD; で確保可能な領域は、EVENTLOGRECORDのサイズを単位としてしか確保できませんよね。 charであれば、1バイト単位で必要なサイズ分を確保することが可能なのでこのような方法を取ります。
その他の回答 (1)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
このエラーは、確保した領域を越えて書き込みが行われているときや、解放済みの領域に書き込みが行われた際に出るエラーです。 なんで、 >調べてみると(1)で解放されていないのですが、delete pBufが処理されていないと思います。 ではなく、 2回目のReadEventLogでpBufが指す領域が既に解放されている領域を渡しているため、ここに書き込まれてエラーになっています。 つまり、領域を確保してないですよってことです。 で、今回のエラーとは直接関係無いんですが、 1度目のReadEventLogで取得したNextSizeは、EVENTLOGRECORDのサイズより大きいことがあるので、 char * pBuf2 = new char[NextSize]; pBuf = (LPEVENTLOGRECORD)pBuf2; というように確保する必要があり、 delete[] pBuf2; と解放する必要があります。おそらくひっかかる個所だと思いますんで。
補足
ご回答 ありがとうございます。 間違ってコメントアウトして記入忘れしていたのですが、 : : 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が無かったものですから・・ たびたび聞いて申し訳ありません。