【发布时间】:2012-03-23 12:57:57
【问题描述】:
我有一个类 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 行中使用赋值运算符时,除了动态 char 数组之外,所有内容均已正确分配。
operator= 函数末尾的测试输出表明,在赋值结束时,一切正常(用户名和路径名正确),但是在赋值后直接从 main 函数测试输出显示所有突然,char 数组发生了变化。突然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);
}
【问题讨论】:
-
为什么不能使用
std::vector<char>s,或std::strings,或至少std::unique_ptr<char[]>s? -
欢迎来到 Stack Overflow!这对于第一个问题来说还不错,但是里面有很多我们不需要看的代码。将来,请尝试发布一个 minimal 可编译的代码示例来演示该问题。在这种情况下,唯一相关的部分是 C 风格的字符串。其余的课程只是噪音,分散了我们对手头真正问题的注意力。
-
@Kristo - 好的,我会努力的