【问题标题】:overloaded assignment operator - char pointers not copying correctly重载赋值运算符 - char 指针未正确复制
【发布时间】: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&lt;char&gt;s,或std::strings,或至少std::unique_ptr&lt;char[]&gt;s?
  • 欢迎来到 Stack Overflow!这对于第一个问题来说还不错,但是里面有很多我们不需要看的代码。将来,请尝试发布一个 minimal 可编译的代码示例来演示该问题。在这种情况下,唯一相关的部分是 C 风格的字符串。其余的课程只是噪音,分散了我们对手头真正问题的注意力。
  • @Kristo - 好的,我会努力的

标签: c++ assignment-operator


【解决方案1】:

您正在从赋值函数中按值返回。您的复制构造函数可能存在缺陷。

【讨论】:

  • 我没有复制构造函数。我也没有在任何地方调用复制构造函数,所以这应该不是问题。
  • @BugalugsNash:您确实有一个复制构造函数,并且您正在调用它(否则您的代码将无法编译)。复制构造函数是隐式定义的默认构造函数这一事实证明它是有缺陷的。
  • 感谢您的回复。我将函数标题更改为: User& operator=(const User&) 即返回值现在是通过引用。修复了问题。
  • 只是出于好奇,我在哪里调用复制构造函数?
  • @BugalugsNash:调用拷贝构造函数初始化operator=的返回值(即-return *this拷贝构造返回值与*this
【解决方案2】:

您可能想在此处查看本教程: http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html

这是一个例子:

  MyClass& MyClass::operator=(const MyClass &rhs) {

    // Only do assignment if RHS is a different object from this.
    if (this != &rhs) {
      ... // Deallocate, allocate new space, copy values...
    }

    return *this;
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2013-08-03
    • 2017-11-21
    • 2014-05-18
    相关资源
    最近更新 更多