Копировать конструктор вопрос - PullRequest
0 голосов
/ 22 декабря 2010

Я пытаюсь понять эту проблему конструктора копирования. Вопрос, который у меня есть, относится к деструктору после выхода из программы. Кажется, переменная char * title не уничтожена, и я думаю, что это может быть неправильно, спасибо

Другой вопрос, почему оператор присваивания не вызывается, когда объект x равен x2. Я использую g ++ с кодовыми блоками.

#include <iostream>

using namespace std;  

class myClass
{
    private:

        int x;
        int *p;
        char* title;

    public:

        myClass(int tx, int* temp, char* newtitle)
        {
            x = tx;
            cout << "int constructor called with value x = " << x << endl;

            p = new int;
            p = temp;

            title = new char [strlen(newtitle)+1];
            strcpy(title, newtitle);
        }
        myClass(const myClass& mc)
        {
            cout << "copy constructor called with value = " << mc.x << endl;
            x = mc.x;
            p = new int;
            *p = *mc.p;

            title = new char [strlen(mc.title)+1];
            strcpy(title, mc.title);
        }
        myClass & operator = (const myClass & that)
        {
            cout << "assignment called" << endl;

            if(this != &that)
            {
                x = that.x;
            }
            return *this;
        }
        ~myClass()
        {
            if (p)
            {
                cout<<"deleting p"<<endl;
                delete p;
            }
            else if(title)
            {
                cout<<"deleting title"<<endl;
                delete[] title;
            }
        }
};

int main()
{
    int pointee = 10;
    int* p = &pointee;
    myClass x(3,p,"hello");
    //myClass y = myClass(3,p);
    myClass x2 = x;
    return 0;
}

Ответы [ 3 ]

3 голосов
/ 22 декабря 2010

У вас есть множество проблем, которые я смог увидеть, как в вашем реальном коде, так и в вашем общем подходе.

Прежде всего, символ * title не удаляется, потому что вы его не удаляете. Вероятно, это логическая ошибка:

    if (p)
    {
        cout<<"deleting p"<<endl;
        delete p;
    }
    else if(title)
    {
        cout<<"deleting title"<<endl;
        delete[] title;
    }

Вам, вероятно, не нужен else. Почему ты положил это туда?

Далее вы пропускаете int, здесь:

    p = new int;
    p = temp;

int, который вы только что new -ed, перезаписывается переданным значением temp.

Позже вы пытаетесь удалить этот указатель в деструкторе. Но так как вы удаляете указатель на автоматическую переменную, вы будете использовать эту кучу. Это тоже логическая ошибка. Решение: не делайте этого: p = temp;

В конечном счете, однако, ваш подход сомнителен на нескольких уровнях.

  1. Почему вы динамически выделяете int с в первую очередь? Просто имейте int члена класса. Не используйте динамическое распределение (например, new и delete), если только действительно не потребуется.
  2. Не выделять строки динамически, используя char* s. Вместо этого используйте std::string из #include <string>
  3. Если вам действительно нужно динамическое распределение, не используйте необработанные указатели. Вместо этого используйте умные указатели. C ++ поставляется с одним встроенным std::auto_ptr из #include <memory.h>, но в других библиотеках есть много других, часто более удачных вариантов. Популярным здесь являются умные указатели Boost.
1 голос
/ 22 декабря 2010

Ваш деструктор удаляет p, если p не является NULL;и он удаляет title, если он не равен NULL , а p равен NULL .

Но и ваш конструктор, и ваш конструктор копирования создают new p и new title все время.Так что вам нужно все время проверять и удалять.

0 голосов
/ 22 декабря 2010

Попробуйте

*p = *temp;

вместо

 p = temp;

и в деструкторе

if(title)

вместо

else if(title)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...