c++ - 重载赋值运算符 - 字符指针未正确复制

标签 c++ assignment-operator

我有一个 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/

相关文章:

分配时的 JavaScript 评估顺序

c++ - 如何使用智能指针作为类属性来复制对象?

c++ - 如果我 "slice"到一个抽象类会发生什么

c++ - 我可以保留该指针的拷贝吗?

c++ - 如何将行号添加到 QTreeView?

c++ - 你能帮忙解决这个错误吗? (g++ 原型(prototype)与类中的任何一个都不匹配)

c - 在 C 中评估赋值运算符的左操作数有什么意义?

c++ - 如何将类成员函数传递给第 3 方库中的方法?

c++ - 使用 Catboost C 评估库 API

c++ - 拷贝构造函数,传值传值,链式操作,编译器