=操作符重載,給復構造函數進行賦值時的代碼如下:
MyString & MyString::operator =(const MyString &str)
{
if(this == &str)
return *this;
delete []m_pData; //**???????????????????????????? **
m_pData = NULL;
m_pData = new char(strlen(str.m_pData) + 1);
strcpy (m_pData, str.m_pData);
return *this;
}
class MyString
{
public:
....
private:
char *m_pData;
}
在函數中為什麼還要是對原有的內存進行釋放,即delete []m_pData,直接賦值 m_pData = str.m_pData, 這樣不行嗎?
請大神指點。
有兩個問題:
1. 如果不delete,那麼m_pData
重新賦值後,原先指向的的內存不能被訪問,也沒有被回收給程序繼續使用,相當於你的內存就減小了一塊,也就是內存洩漏。
2. 不管是否delete,執行m_pData = str.m_pData
都是錯誤的。因為這樣,兩個指針指向的是同一片地址,例如你執行str1 = str2
,如果按你的方式來實現,那麼以後修改str2中的字符串時,由於str1中的m_pData
也指向同一片區域,因此str1中的字符串也會被修改。一般來說,這不是我們希望看到的結果。
類似於這樣:
int a = 1, b = 2;
a = b;
b = 3;
那麼我們希望此時a的值等於2,而不是3。如果執行了b = 3之後,a的值也變成了3,那自然是不符合預期的。