2012-09-17 16 views
0

所以我寫了這兩個版本的重載賦值運算符,用於在課堂上寫的ADT。當我將它們與我的超載ostream < <運算符一起用於同一個ADT時,我會看到不同的結果。爲什麼?是否因爲我將內存釋放到了我正在接受此問題的其他緩衝區?在C++中,這兩個函數的區別是什麼?

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)

+0

在這種情況下,你如何設置bufferSize? – slugonamission

+1

閱讀關於複製和交換成語, – PiotrNycz

回答

6

第二個代碼片段不會追加終止空終止符,因此垃圾(strcpy()複製終止空)。您需要for循環後明確地添加空終止:

buffer[bufferSize] = 0; 
+0

打敗我幾秒鐘。 – Borgleader

+0

memcpy作爲不需要結尾0的替代方案呢? – Lalaland

+0

對我來說,重要的監督是'空終止'字符序列。如果我不復制空字符,那麼它將如何終止? –

2

小竅門:

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

此:

​​

還會將空結束符。這:

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

沒有,因爲它的位置bufferSize+1,你跳過。

我可能會去迭代到位置bufferSize+1而不是值初始化數組。

好吧,廢話,我會去使用std::string來代替。這樣,您不必擔心複製,分配或破壞。

相關問題