猿问

求大佬,请问一下关于user2 = user1;//程序为何没出现错误? =函数内注释?

#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 ();
}

慕斯王
浏览 305回答 2
2回答

慕容森

1、内存没有释放并不会导致程序编译错或执行错,只会导致程序占用的内存不能释放,因此不会错,但在大型程序中反复执行后就会导致内存被大量占用。这就是常说的内存泄露。2、由于USER1和USER2实际上是USER类型实例的指针,相互赋值被你的重定向等号操作接管,由于上面第1条的原因,就算你该函数内不会再分配内存,程序也不会有程序编译或执行错。

浮云间

当然不会出错,因为之后的m_pszName = new char[strlen(user.m_pszName) + 1];又申请了一块新的内存用来存数据了,不会发生内存读写错误。当然,m_pszName原来指向的那块内存就成了内存碎片了。
随时随地看视频慕课网APP
我要回答