と呼ばれるカスタム文字列クラスには、プライベートメンバーを として返すだけStr
の関数があります。これは、新しいものを作成した後に呼び出されたときに機能しますが、その後using を上書きすると、それを呼び出すと機能することがありますが、元のものよりも大きい場合は常に機能します。c_str()
char* data
const char* c_str() const { return data; }
Str
Str
cin
c_str()
cin
Str
Str b("this is b");
cout << b.c_str() << endl;
cin >> b;
cout << b.c_str() << endl;
ここで最初のものは機能しますが、行を 'b' だけb.c_str()
に変更しようとすると、 'b' + 少しのゴミが出力されます。しかし、「bb」に変更しようとすると、通常は機能し、「this is b」よりも長いものに変更すると、常に機能します。Str b
cin >> b;
これは奇妙です。私の istream オペレーター (フレンドになっている) は を完全に割り当て解除し、最終的Str
に、読み込む各 char に対して 1 文字だけ大きい新しい char 配列を割り当ててしまうからです (機能するかどうかを確認するためだけに、機能しません)。したがって、何か他のものを読み取った後に配列を返すと、それdata
が設定された新しい配列が返されるようです。
関連機能:
istream& operator>>(istream& is, Str& s) {
delete[] s.data;
s.data = nullptr;
s.length = s.limit = 0;
char c;
while (is.get(c) && isspace(c)) ;
if (is) {
do s.push_back(c);
while (is.get(c) && !isspace(c));
if (is)
is.unget();
}
return is;
}
void Str::push_back(char c) {
if (length == limit) {
++limit;
char* newData = new char[limit];
for (size_type i = 0; i != length; ++i)
newData[i] = data[i];
delete[] data;
data = newData;
}
data[length++] = c;
}
このように、配列はそれが保持するよりも大きな容量を持つことは決してないので、メモリガベージを出力するpush_back()
方法がわかりません。c_str()