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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1864閲覧

MFC CString関連のエラーの問題点

Angkorwat

総合スコア31

MFC

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/09/21 01:27

編集2018/09/21 01:29

下記のMFCのダイアログベースのアプリケーションのコード(コードは簡略化しています)でエラーでプログラムが落ちてしまいます。
ただ、2つの問題点のうち一つを修正すると落ちなくなりました。

問題点1.main関数のCStringの型キャストで引数に渡していることが問題?
問題点2.関数Aの参照に文字列のポインタを代入していることが問題?

エラーメッセージは"DAMAGE : after Normal block (#63093) at 0x01C79610"
デバッグメッセージはmemory check error at 0x01C7963C = 0x00, should be 0xFD.となっています。

両方に問題あるのか、それともいずれか一つだけ問題あるのか、わかりません。
下記のコードのどこに問題点があるか教えていただければ有難いです。お手数おかけいたしますが宜しくお願いします。

void CMyClass::main(){ CString str; char tmpbuf[180] = {0};//一時的に使用 // 最終的にセットされる文字列 char setBuffer1[180]; char setBuffer2[180]; char setBuffer3[180]; //落ちないケース(問題点1修正済) //文字列1の処理 FuncA(str);//文字列取得 wsprintf( tmpbuf, "%s", str); FuncB(tmpbuf);//文字列加工 str = tmpbuf; wsprintf( setBuffer1, "%s", str) //文字列2の処理 FuncA(str);//文字列取得 wsprintf( tmpbuf, "%s", str); FuncB(tmpbuf);//文字列加工 str = tmpbuf; wsprintf( setBuffer2, "%s", str) //文字列3の処理 FuncA(str); wsprintf( tmpbuf, "%s", str); FuncB(tmpbuf); str = tmpbuf; wsprintf( setBuffer3, "%s", str) // 落ちるケース(問題点1修正前) //文字列1の処理 // FuncA(string); // FuncB((char*)((LPCTSTR)str)); // wsprintf( setBuffer1, "%s", str) //文字列2の処理 // FuncA(str); // FuncB((char*)((LPCTSTR)str)); // wsprintf( setBuffer2, "%s", str) //文字列3の処理 // FuncA(str);//ここで落ちる // FuncB((char*)((LPCTSTR)str)); // wsprintf( setBuffer3, "%s", str) } //関数Aの内容(文字列取得) void CMyClass::FuncA( CString& str ) { char tmp[256] = {0}; GetStringFunc(tmp);//文字列を取得 //str = tmp;//落ちるケース(問題点2修正前) str.Format( tmp );//落ちないケース(問題点2修正済) } //関数Bの内容(文字列加工) void CMyClass::FuncB( char* buffer ){ CString tmpCstr = buffer; ChangeStringFunc(&tmpCstr);//文字列を加工 wsprintf(buffer, "%s", tmpCstr); }

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

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

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

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

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

guest

回答1

0

ベストアンサー

FuncB((char*)((LPCTSTR)str));ですが、LPCTSTRconstの付いたポインタ型です。キャストで無理やりconstを外した場合、未定義の動作(今後の動作は一切保証されない状態)となります。

投稿2018/09/21 01:30

maisumakun

総合スコア145201

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

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

Angkorwat

2018/09/21 01:36

ありがとうございます。やはりキャストで無理矢理外してFuncB内で引数の文字列を加工するとその後の動作がおかしくなるのですね。となると、FuncAでの問題点2は間違っていなく、問題点1が問題を引き起こしているとみていいのですね?
Angkorwat

2018/09/21 01:43

↑補足:CString自体はcharを代入することに対しては問題無いとみております。問題が起き始めたのは型キャストをしてからなので、ほぼ確定かとはおもっております。
Angkorwat

2018/09/21 01:46

ありがとうございます。問題が解決したためベストアンサーといたします。お手数おかけいたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問