ハンドルされていない例外が有る


たく  2006-08-13 18:19:11  No: 62725

度々、お世話になります。

下記のようなコードでハンドルされてない例外が有るとのエラーが出てReleaceが作成できません
デバッグウィンドウには
例外処理 (初回) は AP100.exe (MFC42D.DLL) にあります: 0xC0000005: Access Violation。
が出ています。

strcore.cpp内
void CString::AllocBeforeWrite(int nLen)
{
  if (GetData()->nRefs > 1 || nLen > GetData()->nAllocLength)  <-ここで止まってます
  {
    Release();
    AllocBuffer(nLen);
  }
  ASSERT(GetData()->nRefs <= 1);
}

リリースモードでは実行時にエラーになります。
デバッグモードでは実行できるんですが、ストップしたときにエラーになります。
実行中、メモリーに使用率は100%に上がってしまいます。

何が原因でしょうか?  よろしくお願い致します。

不細工なコードですが

  char Text1[24] ="00000000000000000000000";

  for(int n1=0; n1<31; n1++){  
    for(int n2=0; n2<31; n2++){
      for(int n3=0; n3<31; n3++){
        for(int n4=0; n4<31; n4++){
          for(int n5=0; n5<31; n5++){
            for(int n6=0; n6<31; n6++){
              for(int n7=0; n7<31; n7++){
                for(int n8=0; n8<31; n8++){
                  for(int n9=0; n9<31; n9++){
                    for(int n10=0; n10<31; n10++){  //10
                      for(int n11=0; n11<31; n11++){
                        for(int n12=0; n12<31; n12++){
                          for(int n13=0; n13<31; n13++){
                            for(int n14=0; n14<31; n14++){
                              for(int n15=0; n15<31; n15++){
                                for(int n16=0; n16<31; n16++){
                                  for(int n17=0; n17<31; n17++){
                                    for(int n18=0; n18<31; n18++){
                                      for(int n19=0; n19<31; n19++){
                                        for(int n20=0; n20<31; n20++){  //20
                                          for(int n21=0; n21<31; n21++){
                                            for(int n22=0; n22<31; n22++){
                                              for(int n23=0; n23<31; n23++){
    Text1[0]=StTable[n1];  Text1[1]=StTable[n2];  Text1[2]=StTable[n3];  Text1[3]=StTable[n4];  Text1[4]=StTable[n5];
    Text1[5]=StTable[n6];  Text1[6]=StTable[n7];  Text1[7]=StTable[n8];  Text1[8]=StTable[n9];  Text1[9]=StTable[n10];
    Text1[10]=StTable[n11];  Text1[11]=StTable[n12];  Text1[12]=StTable[n13];  Text1[13]=StTable[n14];  Text1[14]=StTable[n15];
    Text1[15]=StTable[n16];  Text1[16]=StTable[n17];  Text1[17]=StTable[n18];  Text1[18]=StTable[n19];  Text1[19]=StTable[n20];
    Text1[20]=StTable[n21];  Text1[21]=StTable[n22];  Text1[22]=StTable[n23];

    m_Text1 = Text1;
    UpdateData( FALSE );  //<-コールスタックではここから呼んでいる

    OnButton1();
    OnButton3();

    if(m_Text6 == m_MAd && V4_b())
    {
      MessageBox( "データ合致", NULL, MB_OK);
      return;
    }

    MSG msg;
    while(PeekMessage( &msg, NULL, 0, 0, PM_REMOVE)) <-プログラムが反応しなくなるので入れてます
    {
      TranslateMessage( &msg );
      DispatchMessage( &msg );
    }

                                              }  //23
                                            }  //22
                                          }  //21
                                        }  //20
                                      }  //19
                                    }  //18
                                  }  //17
                                }  //16
                              }  //15
                            }  //14
                          }  //13
                        }  //12
                      }  //11
                    }  //10
                  }  //9
                }  //8
              }  //7
            }  //6
          }  //5
        }  //4
      }  //3
    }  //2
  }  //1
  MessageBox( "検索を終了", NULL, MB_OK);


たく  2006-08-13 18:20:22  No: 62726

げぇ、ネストが消えて余計に不細工にないました。


三草  2006-08-13 22:44:03  No: 62727

StTable[]って、型は何ですか?
# 23個のネスト。。。
# Access Violationのとおり、おかしなところへ書き込もうとしていません?


たく  2006-08-14 03:35:37  No: 62728

三草さま

StTableはchar型文字配列です。
24の30乗は、半端じゃなかったです。下5桁をこなすのに3時間も掛かって
しまいました。
ま、これは方法を考えるとして

やはり、メモリーリークのような状態で他のエリアを上書きしてしまってるんでしょうか?
コードを見ないしても、なかなか発見できません。

どの部分がダメなのかを探す方法はないでしょうか?


三草  2006-08-14 08:33:15  No: 62729

StTable[ ]が初期化されていないとか、十分な領域を確保していないとか

> UpdateData( FALSE );  //<-コールスタックではここから呼んでいる
で止まるのであれば、何回目のループで止まっていて、
そのときの
> Text1[0]=StTable[n1]; ・・・ Text1[22]=StTable[n23];
は正しく書き込んでいるかとか

> char Text1[24] と StTabable[ ]の領域をもう少し大きく確保してみるとか

# コードから予測するに、m_Text1 はCStringですよね?


三草  2006-08-14 08:34:25  No: 62730

間違い。。。

誤)
> char Text1[24] と StTabable[ ]の領域をもう少し大きく確保してみるとか

正)
char Text1[24] と StTabable[ ]の領域をもう少し大きく確保してみるとか


near  2006-08-14 21:00:53  No: 62731

エラーを無くすより、アルゴリズムを考え直すことを優先した方がいいでしょう。


たく  2006-08-15 05:47:19  No: 62732

三草さま、nearさま

有難うございました。
やはり、もう少し地道にトレースしてみます。
アルゴリズムも、これではとても使えないので、考えなおします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加