#include <iostream>#include <cstring>using namespace std;class User {public:User (const char* pszName, int nAge) {m_pszName = new char[strlen(pszName) + 1];strcpy (m_pszName, pszName);m_nAge = nAge;}User (const User& user) {cout << "Here is copy constructor" << endl;m_pszName = new char[strlen(user.m_pszName) + 1];strcpy (m_pszName, user.m_pszName);m_nAge = user.m_nAge;}User& operator= (const User& user) {cout << "Here is copy assignment" << endl;if (&user != this) {if (m_pszName) {//delete[] m_pszName;\\為什么去掉也沒有錯誤?//m_pszName = NULL;}m_pszName = new char[strlen(user.m_pszName) + 1];strcpy (m_pszName, user.m_pszName);m_nAge = user.m_nAge;}return *this;}~User (void) {delete[] m_pszName;}void print (void) {cout << "My name is " << m_pszName << ". I'm " << m_nAge << " years old." << endl;}private:char* m_pszName;int m_nAge;};int main (){User user1 ("Zaphod", 42);User user2 ("Tom", 38);user2 = user1;//程序為何沒出現錯誤?user2.print ();}
2 回答

慕容森
TA貢獻1853條經驗 獲得超18個贊
1、內存沒有釋放并不會導致程序編譯錯或執行錯,只會導致程序占用的內存不能釋放,因此不會錯,但在大型程序中反復執行后就會導致內存被大量占用。這就是常說的內存泄露。
2、由于USER1和USER2實際上是USER類型實例的指針,相互賦值被你的重定向等號操作接管,由于上面第1條的原因,就算你該函數內不會再分配內存,程序也不會有程序編譯或執行錯。

浮云間
TA貢獻1829條經驗 獲得超4個贊
當然不會出錯,因為之后的m_pszName = new char[strlen(user.m_pszName) + 1];又申請了一塊新的內存用來存數據了,不會發生內存讀寫錯誤。
當然,m_pszName原來指向的那塊內存就成了內存碎片了。
添加回答
舉報
0/150
提交
取消