перегруженный оператор присваивания - указатели на символы не копируются правильно - PullRequest
1 голос
/ 23 марта 2012

У меня есть класс 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 = показывает, чтов конце самого присваивания все работает отлично (имена пользователей и пути указаны правильно), однако тестовый вывод основной функции непосредственно после присваивания показывает, что массивы символов внезапно изменились.Внезапно имя пользователя 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);
}

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Вы возвращаетесь по значению из функции присваивания.Возможно, ваш конструктор копирования имеет недостатки.

0 голосов
/ 23 марта 2012

Вы можете проверить этот учебник здесь: 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;
  }
...