#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;//程序為何沒出現(xiàn)錯誤?user2.print ();}
2 回答

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

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