プロが教える店舗&オフィスのセキュリティ対策術

すみません教えてください。
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)ここでエラー

A 回答 (2件)

ちょっと順番が前後しますが、



>コンパイルしても定義されていない見たいだし、MSDNで調べてもLPEVENTLOGRECORDが無かったものですから・・

すみません。PEVENTLOGRECORDの間違いですね。
EVENTLOGRECORD*のことです。


という前提で、

>これはヒープメモリがオーバーしたため足りない60サイズを要求しているって意味ですよね?

そうです。

>だとすると、記載してあった
>char * pBuf2 = new char[NextSize];
>pBuf = (LPEVENTLOGRECORD)pBuf2;
>で確保するのでしょうか?

そうなります。


>また、なぜchar型でメモリ領域を作成し、
>EVENTLOGRECORD型でpBufにキャストするのでしょうか?
>pBufはEVENTLOGRECORDですよね?

new EVENTLOGRECORD;
で確保可能な領域は、EVENTLOGRECORDのサイズを単位としてしか確保できませんよね。
charであれば、1バイト単位で必要なサイズ分を確保することが可能なのでこのような方法を取ります。
    • good
    • 0

このエラーは、確保した領域を越えて書き込みが行われているときや、解放済みの領域に書き込みが行われた際に出るエラーです。



なんで、
>調べてみると(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が無かったものですから・・

たびたび聞いて申し訳ありません。

補足日時:2005/03/14 18:41
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A