在一个名为的自定义字符串类中,Str
我有一个函数c_str()
将私有成员返回char* data
为const char* c_str() const { return data; }
. 这在我创建新文件后调用时有效,Str
但如果我随后覆盖Str
using cin
,则调用c_str()
它有时有效,但如果我比原来cin
的更大,则总是有效。Str
Str b("this is b");
cout << b.c_str() << endl;
cin >> b;
cout << b.c_str() << endl;
这里第一个b.c_str()
有效,但如果我尝试在线路上更改Str b
为“b”,cin >> b;
那么它会输出“b”+一些垃圾。但是,如果我尝试将其更改为“bb”,它通常会起作用,如果我将其更改为比“this is b”更长的东西,它总是会起作用。
这很奇怪,因为我的 istream 运算符(它是友好的)完全解除分配Str
并最终为它读取的每个字符分配一个仅大 1 个字符的新字符数组(只是为了看看它是否可以工作,它没有)。因此,在读取其他内容后返回数组似乎会返回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()
输出任何内存垃圾。