質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Q&A

0回答

1706閲覧

ヒープが壊れました。 アクセス違反について

KKKM

総合スコア16

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

0グッド

0クリップ

投稿2019/09/16 08:33

Visual C++ MFC

マルチスレッドでプログラムを作っています。

アクセス違反0xC0000005
ヒープが壊れました
このいずれかのエラーが時折起き、解決したいです。
これらのエラーが起きる位置にコメントしておきました。
またソースが長く関連がありそうな部分を抜き出しましたがそのさいに(){}の数が一部ずれてかもしれません。確認しましたが見逃していたらすみません。
エラーなくデバックが成功する場合もあれば、コメントした部分でエラーが起きることもあります。

原因解決策等ございましたらアドバイスよろしくお願いいたします。

AfxBeginThread(AAA,pSample);で
スレッドを作り以下の処理を行います。
UINT CSampleDlg::AAA(LPVOID pParam){
CSampleDlg* p = (CSampleDlg*)pParam;
for(int i=0;i<50;i++){
p->JOY=p->klrf.LRF(p->joy_angle);//klrfはクラスLRFTHRADでCSampleDlgで宣言していますたまにアクセス違反になります。
p->TILT = p -> klrf.tilt;
}
return 0;
}

class LRFTHREAD
{

public:
LRFTHREAD(void);
~LRFTHREAD(void);
int LRFdistancce(double angle);
double sasa();
int Pattern;
double tilt;
int WoR(long x1,long y1, long x2,long y2,int S_th);
FILE* fplrf;
};

LRFTHREAD::LRFTHREAD(void)
{
TRACE("LRF開始\n");
tilt=0;
}

LRFTHREAD::~LRFTHREAD(void)
{
urg_close(&urg);
//fclose(fp5);
}

int LRFTHREAD::WoR(long x1,long y1, long x2,long y2,int S_th){
//パターン分け
double WIDTH;
int shape;
int W;
int Pattern2;
long XX1;
long YY1;
double XXYY;
XX1 = (x1+x2)/2;
YY1 = (y1+y2)/2;
XXYY= sqrt(pow((double)XX1,2.0)+pow((double)YY1,2.0));
if(S_th==2){
tilt=(double)(y1-y2)/(double)(x1-x2);//アクセス違反になります
abs(tilt)<15 && XXYY<1500)Pattern2=2;
else Pattern2 =3;
WIDTH = sin(rad)*sqrt(pow((double)(x1-x2),(double)2)+pow((double)(y1-y2),(double)2));
return Pattern2;
}
return 1;
//
}

int LRFTHREAD::LRFdistancce(double angle){
//tilt=0;///////////////////////////コメントアウト外すとアクセス違反
//
count2_1=//適当に整数を入れています
fplrf = fopen("LRF34131.csv","a");//たまにアクセス違反となります
switch(count_2-1){
case 0:
pattern =1;
break;
case 1:
pattern =2;
break;
case 2://
pattern = WoR(-obj_y[0],obj_x[0], -obj_y[1],obj_x[1],count_2-1);
break;
}
Ms=(double)clock()/1000;

FE = fprintf(fplrf," ,%lf,%d,%lf,%ld,%ld,%ld,%d,%d,%d\n",Ms,i,-radian[i-D]*180/3.14,length[i-D],-y[i-D],x[i-D],count_1,check,count_2); FE = fprintf(fplrf," ,%lf,%d,%lf,%ld,%ld,%ld,%d,%d,%d,%lf,%lf\n",Ms,i,-radian[i-D]*180/3.14,length[i-D],-y[i-D],x[i-D],count_1,check,count_2,-obj_y[count_2-1],obj_x[count_2-1]); if(FE < 0)TRACE("fprintf %d\n",FE); else FE = fprintf(fplrf,"\n,時間,i,角度,距離,y,x,count_A,check,count_B,obj_x,obj_y\n"); FE = fflush(fplrf); for(int i = 0;i < count_2; i++){ if(i==0){fprintf(fplrf,"pattern ,%d,tilt ,%lf\n,,obj_x,obj_y\n",pattern,tilt); fflush(fplrf); } fprintf(fplrf,"i,%d,%lf,%lf\n",i,obj_x[i],obj_y[i]); fflush(fplrf);    fclose(fplrf); TRACE("\n"); free(length_data); //urg_close(&urg); return pattern;

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KoichiSugiyama

2019/09/16 14:55

もうちょっとプログラムについて説明していただけませんか?回答する方たちも質問者さんの代わりにデバッグをするわけではないので、どういう目的のプログラムで、どういう処理のためにスレッドを使っているのかあたりは書いていただけるとポイントが絞り込みやすいのではないかと思います。 また、「ヒープが壊れました」というエラーが不特定の箇所で発生するということは、問題はエラーが発生した箇所ではなく、別の箇所で例えば配列の範囲を超えて書き込みを行なったとか、すでに解放されたデータを読み込もうとしたとかの類ではないかと推測できます。スレッド内で参照されているオブジェクトを意図しないタイミングで解放したり初期化する可能性がないか、呼び出し側をもうちょっと確認されたほうがいいのではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問