ヒープエラーが発生しました!ヒープ領域とは?

このQ&Aのポイント
  • ヒープエラーコードが表示されましたが、そのエラーメッセージを訳すと、「ヒープ領域の終了後にアプリケーションがメモリに書き込みを行った」という意味です。
  • ヒープ領域とは、メモリ管理の一部であり、プログラムが実行中に必要なメモリを動的に確保するための領域です。
  • このエラーが発生する原因は、ヒープ領域の使用方法に問題があることが考えられます。ヒープ領域を使い切った可能性や、本来上書きしてはならないヒープの部分に上書きが行われた可能性があります。
回答を見る
  • ベストアンサー

HEAP に関すること

HEAP CORRUTOPN DETECTED: AFTER Normal block(c# 179) at 0x003EA6D0 CRT detected that the application wrote to memory after end of heap buffer; というエラーがでたのですが、最後の二行を訳すと、 ヒープ領域が終わったあとにアプリケーションがメモリーに書き込んだ のをCRTが発見したということになると思うのですけど、 これは、ヒープを使い切ったということになるのでしょうか? それとも、本来上書きしてはならないヒープの部分に上書きしたことに なるのでしょうか? ネットで今調べているのですがなかなか結論が出せなくて。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.1

ここに解説があります http://msdn.microsoft.com/ja-jp/library/ms810466.aspx ”ヒープの破損によりスローダウンが起こる” が該当すると思われます。

その他の回答 (1)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

newなどで確保したサイズ以上の領域にデータを書き込んだ、 つまりは後者のバグがあるということです。

kaijinu-un
質問者

お礼

ありがとうございました。 無事アクセス違反のメモリーを発見しました。 三個しか確保していない配列の三番目の領域にアクセスしてました

関連するQ&A

  • C++のメモリアクセス?のエラー

    int型の配列を0で初期化しようと思い ~クラスメンバ~ int push_counter[20] ; ~コンストラクタ内~ push_counter[20] = {}; と書いて実行、終了したら CRT detected that the application wrote to memory after end of heap buffer; というエラーが出ました。 存在しないものにアクセスしてますよー って意味だと思うのですが、 for( int i=0 ; i<20 ; i++ ) push_counter[i] = 0; にすればエラーは出なくなったのですが、 push_counter[20] = {}; この書き方でも出来ると思うのですが何故なのでしょうか…

  • メモリリークについて

    VC6.0でデバッグ実行すると Detected memory leaks! Dumping objects -> ソースファイル名(932) : {136739} normal block at 0x00FD4AC0, 0 bytes long. Data: <> メッセージがあり メモリがリークしているようです メッセージやソースから察するに 0バイトの領域を確保し それを解放したときに起こっているようです 領域をmallocして 解放ではNULLでなければ解放 という処理はしてはいけないことなのでしょうか 0バイトの領域を確保した場合 又は0バイトの領域を確保しないように 処理しないといけないのでしょうか? 知識のある方よろしくお願い致します

  • [VisualC++6.0] 突然変数の値が変わります

    リリースビルドでは問題なく実行されるのですが、 デバッグビルドでは、途中でプログラムが強制終了されてしまいます。 Debug Error! Program:D:~~.exe DAMAGE:after Normal Block(#*****) at 0x********. このような警告ウィンドウが出ます。 デバッグしてみるとwhile文中で突然変数の値が突然変わっているように見えるのですが… (特に64,320等の値になるようです) DBGHEAP.C というファイルの /* if we didn't already check entire heap, at least check this object */ if (!(_crtDbgFlag & _CRTDBG_CHECK_ALWAYS_DF)) { /* check no-mans-land gaps */ if (!CheckBytes(pHead->gap, _bNoMansLandFill, nNoMansLandSize)) _RPT3(_CRT_ERROR, "DAMAGE: before %hs block (#%d) at 0x%08X.\n", szBlockUseName[_BLOCK_TYPE(pHead->nBlockUse)], pHead->lRequest, (BYTE *) pbData(pHead)); if (!CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMansLandFill, nNoMansLandSize)) _RPT3(_CRT_ERROR, "DAMAGE: after %hs block (#%d) at 0x%08X.\n", szBlockUseName[_BLOCK_TYPE(pHead->nBlockUse)], pHead->lRequest, →→→ (BYTE *) pbData(pHead)); } の →→→ の部分で引っかかっているようです。 vector<(クラス名)>を使っているのですが、関係あるのでしょうか? 素人な質問で申し訳ありません。よろしくお願いします。

  • ヒープメモリの解放について

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

  • global変数をブロック内から参照したい

    可変長配列の可変長配列を飲み込んで 吐き出すコードです global変数 *st_memory こいつをブロック内から参照するには どない書けば良いのでしょうか 構造体とか他の関数から引っぱり出しても 何故にかSegmentation faultで弾かれます mallocとかgotoの処理は無視して下さい _________________________ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #define MAX 256 typedef enum{ SUCCESS, EOF_FILE, MEM_OVER }Add_List; char *st_memory = NULL; //global void free_buffer(void){ free(st_memory); st_memory = NULL; } Add_List add_char(const int ch,int *count){ static int buffer = 0; assert(buffer >= *count); if(buffer == *count){ st_memory = (char *)realloc(st_memory, (buffer + MAX) * sizeof(char)); if(st_memory == NULL)return MEM_OVER; buffer += MAX; }// END if st_memory[*count] = ch; (*count)++; return SUCCESS; } // END add_char(const int,int); Add_List read_line(FILE *fp,char **line){ int ch,used_line = 0; Add_List status = SUCCESS; while((ch = getc(fp)) != EOF){ if(ch == '¥n'){ status = add_char('¥0',&used_line); if(status != SUCCESS)goto FUNK_END; break; } // END if status = add_char(ch,&used_line);// MAIN if(status != SUCCESS)goto FUNK_END; }// END while if(ch == EOF){ if(used_line > 0){ status = add_char('¥0',&used_line); if(status != SUCCESS)goto FUNK_END; }else{ status = EOF_FILE; goto FUNK_END; } // END if } // END if line[0] = (char *)malloc(sizeof(char) * used_line); if(line[0] == NULL){ status = MEM_OVER; goto FUNK_END; } strcpy(line[0],st_memory);// MAIN FUNK_END: if(status != SUCCESS)free_buffer(); return status; }// END read_line(FILE *,char **); char ** add_line(char **text_file,char *mem_line, int *line_alloc_num,int *line_num){ assert(*line_alloc_num >= *line_num); if(*line_alloc_num == *line_num){ text_file = (char **)realloc(text_file, (*line_alloc_num + MAX) * sizeof(char)); if(text_file == NULL)exit(0); *line_alloc_num += MAX; } // END if text_file[*line_num] = mem_line; (*line_num)++; return text_file; } // END add_line(char **,char *,int *,int *); char ** read_file(FILE *fp,int *line_p){ char **text_file = NULL; int line_alloc_num = 0; int line_num = 0; char *mem_line = NULL; while(read_line(fp,&mem_line) == 0){ text_file = add_line(text_file, mem_line,&line_alloc_num,&line_num); } // END while text_file = (char **)realloc(text_file, line_alloc_num * sizeof(char)); if(text_file == NULL)exit(0); *line_p = line_num; return text_file; } // END read_file((FILE *,int *); int main(void){ char **text = NULL; int i,line_num = 0; text = read_file(stdin,&line_num); printf("¥n"); for(i=0;i<line_num;i++) printf("%s¥n",text[i]); return 0; } ______________________

  • Heapについて教えてください

    Heapというブランドのカバーオールを買ったのですがそのブランドについて教えて欲しいです。 商品を非常に気に入ったのでブランドについてと、どこにその店があるのか教えてもらえると嬉しいです。

  • make_heap()が分かりません

    #include <iostream> #include <vector> #include <algotithm> using namespace std; int main() { vector<char> v; int i; for(i=0;i<20;i+=2)v.push_back('A'+i); couti<<"sequence before building heap:\n"; for(i=0;i<v.size();i++)cout<<v[i]<<" "; cout<<"\n\n"; make_heap(v.begin(),v.end()); //? couti<<"sequence after building heap:\n"; for(i=0;i<v.size();i++)cout<<v[i]<<" "; cout<<"\n\n"; } の結果が sequence before building heap: A C E G I K M O Q S sequence after building heap: S Q M O I K E A G C ということですが make_heap() の機能がわかりません make_heap() の機能・動作に付いて教えてください (書き間違いがあるかもしれませんので容赦ください)

  • heap on

    "In the central granary of the government, new grain was heaped on top of the old until the building was full and the grain overflowed and piled up outside, where it spoiled and became unfit to eat." heap onってなんですか?

  • HEAP または MEMORYについて

    MySQLでのキャッシュを使用したストレージエンジン、HEAP またはMEMORYについて質問です。 あるゲームのスコアランキングを表示したいのですが、 ユーザーごとに最新のデータでのランキングとしたいので、処理が重くなりそうです。 仮にrankingテーブルとして、 sequenceID:シーケンスID(主キー) int auto increment score:得点 user:ユーザー select `user`,`score` from `ranking` where `sequenceID` in ( select `sequenceID`,`score` from `ranking` group by `user` order by max( `sequenceID`) ) order by `score` desc クエリはこんな感じで大丈夫でしょうか。。。。 このクエリ自体はためしていませんが、 とりあえず、重そうですので、HEAP または MEMORY のようなストレージエンジンを使いたいと考えています。 この場合の注意点はどういうところでしょうか。 再起動で消える、ということは承知していますので、メモリ上限にならないようにする工夫などの体験談というか、実際にMEMORYで運用されたことがある方、ぜひご助言ねがいます。

    • ベストアンサー
    • MySQL
  • WinmostarでWinGAMESSがうごかない!

    英語が分からず、さらに初心者なのでさっぱりわかりません。 Winmostarはインストール済みで、 Wingamessは解凍し、C\WinGAMESSに入っています。 WinmostarでGAMESSのパスを設定したのですが、 GAMESS start.を押してもうまく計算されませんでした。 下にそのときにでたコマンドを書いておきます。 (多少の写し間違いがあるかもしれません) C:\winmos3>rem ---GAMESS--- C:\winmos3>echo off ******************** *** GAMESS START *** ******************** C:\WinGAMESS/ddikick.exe C:\WinGAMESS/gamess.08.exe temp -ddi 1 1 (ユーザー名) -scr C:\WinGAMESS\scratch ddikick.x: Fatal error detected. The error is most likely to be in the application, so check for input errors, disk space, memory needs, application bugs, etc... ddikick.x will now clean up all process, and exit... unset echo EInOutError がモジュール UNIX2DOS>EXE の 00008E3A で発生しました。 I/O エラー (32) ****************** *** GAMESS END *** ****************** ここまでです。 unset echo が表示されてからしばらくすると 「問題が発生したため、UNIX2DOS.EXE を終了します。」 というダイアログがでます。 スペックは  Intel Pentium(R)III Mobile CPU 1066MHz 1.06 GHz, 512 MB RAM いろんなサイトを見たのですが、全然動いてくれません。 SETとか、何をどういじればいいのかわかりません。 Cygwinとかいうソフトは要るんですか? よくわからないので、最初からでもいいのでぜひ教えて下さい。