古い C/C++ アプリケーションのデバッグ マクロをクリーンアップしているときに、この問題に遭遇しましたostrstream
。このような:
Tracer() << "some" << " message" << " here";
チェーンの最初の値が上記のような定数文字列の場合ostrstream::str()
、トレーサーを呼び出した結果 (これはデストラクタで実行され、結果をキューに挿入します) には、この文字列へのポインタの 16 進数表現が含まれます。文章。したがって、上記のステートメントは次のような結果になり"0x401a37 message here"
ます。これは古いマクロでは発生しませんでした。これは、削除された最初の値として常に長い (スレッド ID) を持っていたためです。
gdb を使用してステップインすると、最初の挿入でoperator<<(void const*)
は ostrstream が呼び出され、その後の挿入では呼び出しが行われることがわかりましたoperator<< <...>(basic_ostream<...>&, char const*)
(読みやすくするためにテンプレートを削除しました)。
誰かがこの動作を説明できますか? これを修正するためのクリーンな方法は何でしょうか? << left
最初の引数として使用する簡単な回避策を見つけました- これは安全ですか? これを行うためのより良い方法はありますか?
最小化された例を次に示します。
#include <strstream>
#include <iostream>
using namespace std;
class Trace : public ostrstream {
public:
Trace();
virtual ~Trace();
};
Trace::Trace() : ostrstream() {}
Trace::~Trace() {
static_cast< ostrstream& >(*this) <<ends;
char * text = ostrstream::str();
cout << "MESSAGE: "<< text <<endl;
delete[] text;
}
int main(){
Trace() << "some" << " text" << " here";
Trace() << left << "some" << " text" << " here";
Trace() << 123 << " text" << " here";
}