我有一个 User 类,如下所示:
class User
{
private:
char* p_username;
int nProcesses;
struct time
{
int mins;
int secs;
} totalTime;
int longestPID;
char* p_longestPath;
public:
User();
User(const char[],int,int,int,const char[]);
~User();
User operator=(const User&);
// Other functions
};
重载的赋值运算符函数是:
User User::operator=(const User &u)
{
if (this != &u)
{
delete [] p_username;
delete [] p_longestPath;
p_username = new char[strlen(u.p_username)+1];
strcpy(p_username,u.p_username);
nProcesses = u.nProcesses;
totalTime.mins = u.totalTime.mins;
totalTime.secs = u.totalTime.secs;
longestPID = u.longestPID;
p_longestPath = new char[strlen(u.p_longestPath)+1];
strcpy(p_longestPath,u.p_longestPath);
}
return *this;
}
使用赋值运算符的示例主程序:
int main()
{
cout << "\n\nProgram\n\n";
User u("Username",20,30,112233,"Pathname"),u2;
u2 = u;
}
当我尝试在行 u2 = u 中使用赋值运算符时,除动态字符数组外,所有内容均已正确赋值。
operator= 函数末尾的测试输出显示,在赋值本身的末尾一切正常(用户名和路径名是正确的),但是在赋值后直接从 main 函数的测试输出显示所有突然,字符数组发生了变化。突然u2的用户名是空的,路径名的前半部分是垃圾。
如果在赋值运算符函数的末尾用户名和路径名是完美的,那么在调用函数中它们怎么会错呢?
这真的让我难住了......
编辑:这里是构造函数
User::User()
{
p_username = 0;
nProcesses = 0;
totalTime.mins = 0;
totalTime.secs = 0;
longestPID = -1;
p_longestPath = 0;
}
User::User(const char UID[],int minutes,int seconds,int PID,const char path[])
{
p_username = new char[strlen(UID)+1];
strcpy(p_username,UID);
nProcesses = 1;
totalTime.mins = minutes;
totalTime.secs = seconds;
longestPID = PID;
p_longestPath = new char[strlen(path)+1];
strcpy(p_longestPath,path);
}
最佳答案
您正在从赋值函数中按值返回。您的复制构造函数可能有缺陷。
关于c++ - 重载赋值运算符 - 字符指针未正确复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9839621/