1

残念ながら、私が持っているドキュメントは、(a)エラーのない元の製品ドキュメント(MS VC ++ 6.0ヘルプファイル)または(b)後のMFCバージョンに適用される後のMSDNヘルプのいずれかです。

特に:

[Q1]オペレーター+=はVC++6 MFCでバグがあることがわかっていますCStringか?VC ++ 6のこのコードは、最新のMFCアプリでコンパイルする前に修正する必要がありました。

    CString szTemp;
    unsigned char m_chReceive[MY_BUF_SIZE];

    // compiles and seems to run but may be buggy in VC++6, won't compile in modern MFC
szTemp += m_chReceive; 
    // the above won't compile in modern MFC versions, but this "&+cast" does:
szTemp.Append( (const char *)&m_chReceive[0]); 

[Q2]このように、関数の結果としてCStringを返すのは安全で堅牢ですか、それともメモリの破損を引き起こしますか?

 CString MyClass:MyMethod(void)
 {   CString Stuff;
     // set a value to Stuff here.
     return Stuff; // return a stack-allocated-CString 
 }

私はあちこちで上記の2つを使用し、ランダムなランタイムメモリの破損も示しているように見えるコードを持っています。これらの2つは私にとって危険信号です。CStringは、Visual C ++ 6.0のMFCの作成者によって、intまたはchar型のように使用して関数から返すことができる単純なものとして意図されていたのではないかと疑っています。どういうわけか、コピーコンストラクタとメモリ管理はすべてうまくいきましたか?

明らかなこと: はい、もちろん、可能な場合はすべてのコードをVC ++ 6.0から削除しますが、最初にクラッシュしている本番システムにパッチを適用する必要があります。次に、このレガシーコードベースを前進させるという大きなタスクを開始できます。

4

2 に答える 2

1

VC6.0のドキュメントによると

CStringオブジェクトは、連結操作の結果として大きくなる可能性があります。CStringオブジェクトは「値のセマンティクス」に従います。</p>

于 2012-12-15T17:37:11.663 に答える
0

MicrosoftのドキュメントによるとCString、目的はstd::string必要に応じて自動的に拡張され、関数の引数または戻り値として安全に渡すことができるという点で類似しているようです。

于 2012-12-15T17:23:51.507 に答える