所以我为我在课堂上写的ADT编写了这两个版本的重载赋值运算符。当我将它们与我的重载ostream<<一起使用时对于同一个ADT的操作员,我看到了不同的结果。为什么?是因为我将内存释放到我收到此问题的其他缓冲区吗?
void Text::operator= (const Text &other) {
if (this != &other) {
delete [] buffer;
bufferSize = other.bufferSize;
buffer = new char[bufferSize + 1];
strcpy(buffer, other.buffer);
}
}
void Text::operator= (const Text &other) {
if (this != &other) {
delete [] buffer;
bufferSize = other.bufferSize;
buffer = new char[bufferSize + 1];
for (int i = 0; i < bufferSize; i++) {
buffer[i] = other.buffer[i];
}
}
这是我重载的ostream&lt;&lt;,
ostream & operator << (ostream &output, const Text &outputText) {
output << outputText.buffer;
return output;
}
差异如下:
第一个输出:Hey Jude
第二个输出:Hey Jude(random garbage)
答案 0 :(得分:6)
第二个代码片段不附加终止空终止符,因此垃圾(strcpy()
复制终止空值)。您需要在for
循环后显式添加空终止符:
buffer[bufferSize] = 0;
答案 1 :(得分:2)
小技巧:
buffer = new char[bufferSize + 1]();
此:
strcpy(buffer, other.buffer);
还复制以null结尾的字符。这样:
for (int i = 0; i < bufferSize; i++) {
buffer[i] = other.buffer[i];
}
没有,因为它位于bufferSize+1
,你跳过了。
我可能会使用迭代来定位bufferSize+1
而不是对数组进行值初始化。
好的,废弃它,我会选择使用std::string
。这样,您就不必担心复制,分配或破坏。