として定義されているクラスにプライベート属性がありますvector<pair<char *, int> > data;
。でこのベクトルにデータを追加しますdata.push_back(make_pair(p, r));
。後でベクトルからデータを取得しようとすると、p 値の悪いデータが得られます。返されるデータは次のようになり��U3
ます。これは、char配列へのポインタが格納されているためだと思います。実際のコピーをベクターに保存するにはどうすればよいですか。それが役立つ場合、char 配列は 255 文字 + 1 を超えて null で終了することはありません。
5 に答える
を使用する本当の理由はchar*
?
を使用するstd::string
と、問題が解消されます。
スタック変数を介して文字列を割り当て、そのアドレスを格納していますか?これにより、割り当てた関数から戻るときに説明する問題が発生します。
(新しい演算子を使用して)ヒープに文字列を割り当ててから、ヒープに割り当てられたアドレスを格納することをお勧めします。例えば
char* pNext = new char[50];
strcpy(pNext, ...);
data.push_back(make_pair(pNext, r));
char配列を使用して、すべて独自の作業を行う必要があります。たとえば、nullで終了していることを確認する必要があります。そうしないと、印刷時に予期しない出力結果が発生します。
例えば
pNext[49] = '\0';
また、ヒープに割り当てられた文字列が終了したら、それらも削除する必要があることに注意してください。したがって、char*は削除されます。
delete [] pNext;
他の人が言っているように、頭痛の種を減らす他の文字列の実装があります。
最も使いやすいのはおそらくCStringですが、MFCの実装またはATLの実装のいずれかを含めるとオーバーヘッドが発生します。std :: stringは、他の人が言及しているように、代替手段です。
お役に立てれば!
p (その時点で定義されている) へのポインターがスタックに配置されているように見えます。スタック フレームがポップ オフされると、ポインタはまだありますが、ポインタが指すメモリはガベージである可能性があります。#include <string>
この種のダングリング ポインターの問題は厄介になる可能性があるため、文字列データを格納するために定義されている std::string クラスを使用することをお勧めします。
STL はコピーと値のセマンティクスに基づいているため、単なるポインターではなく、文字列全体をコンテナー (ここではvector
) に格納した方が簡単です。STL コンテナーにポインターを保持できるため、「より簡単」と言いましたが、ポイントされたメモリはユーザー コードで管理する必要があります。質問からすると、されていないようです。
string
したがって、おそらく、代わりに を使用できますchar *
。たとえば、次のようになります。
typedef std::pair< std::string, int > MyPair;
std::vector< MyPair > data;
vector<pair<char *, int> >
ネイキッド ポインターを扱っていて、strings の有効期間を手動で管理する必要がある場合。これは主要な PITA であり、何か間違ったことをしている可能性が非常に高いです(特に、これを正しく行うと主張することさえしなかったため、これを行う必要があることさえ知らないことを示唆しているようです)。
他のものと同様に、代わりに使用することをお勧めしますvector<pair<std::string, int> >
。