0

sprintf 関数を圧縮する関数を作成しようとしていますが、どういうわけか次の問題に遭遇しました。

クラスを呼び出した後の最初の行 (以前は関数でしたが、それも機能しませんでした) 正しい結果が得られました: http://puu.sh/1m1Bw

しかし、クラスや変数にも触れていないのに、まったく違うものを取得した後の行: http://puu.sh/1m1BR

誰かがここで何が起こっているのか説明できますか?

編集:実際のクラスを忘れました:

StringCreator::StringCreator(char* _parten, ...) {
        char buff[255];

        va_list args;
        va_start (args, _parten);
        vsprintf (buff,_parten, args);
        va_end(args);

        this->str = buff;
    }

そして .h ファイルで:

class StringCreator {
public:
    StringCreator(char* _parten, ...);
    char* str;
};
4

1 に答える 1

2

StringCreator()コンストラクターが完了すると、メンバー変数はコンストラクターのローカル変数をthis->str指しているため、ダングリング ポインターになります。buffコンストラクターの後のアクセスthis->strは未定義の動作です。stra から achar*への変更std::stringは解決策です。a にアクセスする必要がある場合は、const char*を使用できますstr.c_str()。a を使用するstd::stringと、デフォルトのコピー コンストラクターと代入演算子が正しいことも意味します。

この回答へのコメントに示されているようnew char[255]に、 を使用する代わりに を使用する場合は、コピー不可std::stringにするかStringCreator、 のコンテンツをコピーするコピー コンストラクターと代入演算子を実装する必要がありstrます。3 のルールとは何ですか? を参照してください。または、動的割り当てを使用して回避することができchar str[255];、デフォルトのコピーStringCreatorが正しいでしょう。

vsprintf()代わりに (コンパイラが C99 をサポートしている場合)使用する呼び出しでの潜在的なバッファ オーバーランを回避するには、vsnprintf()データが取り込まれるバッファのサイズを引数として受け入れ、指定されたサイズを超えて書き込みません。

于 2012-11-03T19:52:11.357 に答える