亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

求大佬,請問一下關于user2 = user1;//程序為何沒出現錯誤? =函數內注釋?

求大佬,請問一下關于user2 = user1;//程序為何沒出現錯誤? =函數內注釋?

慕斯王 2021-04-11 15:11:35
#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條的原因,就算你該函數內不會再分配內存,程序也不會有程序編譯或執行錯。

查看完整回答
反對 回復 2021-04-18
?
浮云間

TA貢獻1829條經驗 獲得超4個贊

當然不會出錯,因為之后的m_pszName = new char[strlen(user.m_pszName) + 1];又申請了一塊新的內存用來存數據了,不會發生內存讀寫錯誤。
當然,m_pszName原來指向的那塊內存就成了內存碎片了。

查看完整回答
反對 回復 2021-04-18
  • 2 回答
  • 0 關注
  • 339 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號