#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
提交
取消