MFCのCString::Formatで"Bufer to small"エラー

以下の様なVC++MFC依存*1なコードがあったとき…

strFile =_T("c:\\data\\hoge\\test.dat");
CString strtmp = strFile.Mid(strFile.ReverseFind('\\') + 1);
strtmp.Format(_T("%s (%f)"), strtmp, foo);

で実行すると, デバッグ用の 〜\vsprintf.c で、

Microsoft Visual C++ Debug Library
“Debug Assertion Failed!
Expression: (“Buffer to small”, 0)

というエラーが表示されてしまう。スタックを見ると.Formatを呼び出しているところでAssertが起きている。
エラー内容について検索をかけると結構引っかかるのだが、解決策が特に見当たらない。
Microsoft Connectにも登録はされているが、再現不可能として却下されている。…数年前だが。
CString.Format is occassionally giving a debug assert failure

恐らくこういうときは、95%以上の確率で自分が変なことをしているというのが、ささやかな自分の経験則なので見直す。
で、ふと気づくと非常に気持ち悪いことをしていたので、以下の様に修正する

CString strtmp, strfilename;
strfilename = strFile.Mid(strFile.ReverseFind('\\') + 1);
strtmp.Format(_T("%s (%f)"), strfilename, foo);

assertは表示されなくなった。ひとまず問題解決。
.Formatで文字列を作ろうとしているものと、そこに流し込もうとしているものが同じインスタンスを指すというのは良く考えると気持ち悪い。
直感的に気持ち悪いこと*2はあまりしないほうが良いことが多い。

*1:全くC++を書いているという気がしない

*2:どこかに書いた様なコードをほぼコピペの様な形で別の箇所で書くとか…

(Visited 7 times, 1 visits today)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です