度々、お世話になります。
下記のようなコードでハンドルされてない例外が有るとのエラーが出て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);
げぇ、ネストが消えて余計に不細工にないました。
StTable[]って、型は何ですか?
# 23個のネスト。。。
# Access Violationのとおり、おかしなところへ書き込もうとしていません?
三草さま
StTableはchar型文字配列です。
24の30乗は、半端じゃなかったです。下5桁をこなすのに3時間も掛かって
しまいました。
ま、これは方法を考えるとして
やはり、メモリーリークのような状態で他のエリアを上書きしてしまってるんでしょうか?
コードを見ないしても、なかなか発見できません。
どの部分がダメなのかを探す方法はないでしょうか?
StTable[ ]が初期化されていないとか、十分な領域を確保していないとか
> UpdateData( FALSE ); //<-コールスタックではここから呼んでいる
で止まるのであれば、何回目のループで止まっていて、
そのときの
> Text1[0]=StTable[n1]; ・・・ Text1[22]=StTable[n23];
は正しく書き込んでいるかとか
> char Text1[24] と StTabable[ ]の領域をもう少し大きく確保してみるとか
# コードから予測するに、m_Text1 はCStringですよね?
間違い。。。
誤)
> char Text1[24] と StTabable[ ]の領域をもう少し大きく確保してみるとか
正)
char Text1[24] と StTabable[ ]の領域をもう少し大きく確保してみるとか
エラーを無くすより、アルゴリズムを考え直すことを優先した方がいいでしょう。
三草さま、nearさま
有難うございました。
やはり、もう少し地道にトレースしてみます。
アルゴリズムも、これではとても使えないので、考えなおします。
ツイート | ![]() |