0

所以我为我在课堂上写的 ADT 编写了这两个版本的重载赋值运算符。当我将它们与同一个 ADT 的重载 ostream << 运算符结合使用时,我看到了不同的结果。为什么?是因为我将内存释放到另一个缓冲区,我收到了这个问题吗?

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 <<,

ostream & operator << (ostream &output, const Text &outputText) {
output << outputText.buffer;
return output;
}

差异是这样发生的:

第一个输出:Hey Jude

第二个输出:Hey Jude(random garbage)

4

2 回答 2

6

第二个代码片段不附加终止空终止符,因此垃圾(strcpy()复制终止空)。您需要在for循环后显式添加空终止符:

buffer[bufferSize] = 0;
于 2012-09-17T21:29:33.843 回答
2

小技巧:

buffer = new char[bufferSize + 1]();

这:

strcpy(buffer, other.buffer);

还复制空终止字符。这:

 for (int i = 0; i < bufferSize; i++) {
     buffer[i] = other.buffer[i];
 }

没有,因为它在bufferSize+1你跳过的位置。

我可能会迭代到位置bufferSize+1而不是值初始化数组。

好吧,放弃那个,我会用 astd::string代替。这样,您就不必担心复制、分配或破坏。

于 2012-09-17T21:29:36.000 回答