为了账号安全,请及时绑定邮箱和手机立即绑定

求大佬,请问一下关于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条经验 获得超3个赞

当然不会出错,因为之后的m_pszName = new char[strlen(user.m_pszName) + 1];又申请了一块新的内存用来存数据了,不会发生内存读写错误。
当然,m_pszName原来指向的那块内存就成了内存碎片了。

查看完整回答
反对 回复 2021-04-18
  • 2 回答
  • 0 关注
  • 270 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信