が、私はこのは私がのCString ::フォーマットを使用するか
コード1のような2コード持ってsprintf_sべき:CStringの:: Formatメソッドを
CString cStr;
char* ToString(CString pszFormat, ...)
{
va_list argList;
va_start(argList, pszFormat);
cStr.FormatV(_T(pszFormat), argList);
va_end(argList);
return (LPTSTR)(LPCTSTR)cStr;
//Note that this will return the pointer to the cstring content
}
コード2:sprintf_s方法
char strChar[100];
char* ToString(char const* const _Format, ...)
{
va_list argList;
va_start(argList, _Format);
vsprintf_s(strChar, _Format, argList);
va_end(argList);
return strChar;
//Note that this will return the pointer to the string content
}
でコード1、私は完全に安全だと感じています - 私は長さが長すぎるかもしれないことを恐れる必要はありません。しかし、コード1はパフォーマンスを低下させる恐れがあります。私はそれがメモリリークを引き起こすかどうかわからない。そして、Cstringに動的な長さがあると、多分、それは誰のビジネスのようにメモリを割り振り、解放するだろうと思います。
私はコード2を思いついています。しかし、コード2では、_Formatを長すぎるような長さの文字列を1000に渡すと危険に直面します。プログラムが 'バッファーが小さすぎます'というエラーでクラッシュします。
私が優れている1かわからない:CStringの::フォーマットまたはsprintf_s? sprintf_sが実際にパフォーマンスを向上させ、CString :: Formatがパフォーマンスに悪い場合は、sprintf_sで「バッファが小さすぎる」のを防ぐためにさらに努力します。しかし、sprintf_sがそれほど価値がない場合は、CString :: Formatを使用します。
は、読書のためにありがとうございます。あなたはstrCharのバッファがオーバーフローかもしれないと心配している場合
どちらの実装は、完全な偽です。最初のものは、不変なオブジェクト内部への非constポインタを返します。あなたがこれについて安全を感じるなら、あなたは[The Definitive C++ Book Guide and List](http://stackoverflow.com/q/388242/1889329)からいくつかの本を読む必要があります。 2つ目はメモリを破壊します。パフォーマンスについて懸念しており、正確性について気にしないので、どちらの実装を最適化しても時間がかからないようにするのは簡単です。また、パフォーマンスを測定できない場合は、とにかく気にしないでください。 – IInspectable
@IInspectableあなたのアドバイスありがとうございます。 – 123iamking