Параметризовать указатель внутри конструктора - PullRequest
1 голос
/ 10 апреля 2019

Я назначаю указатель на указатель внутри конструктора класса. В деструкторе я удаляю указатель, который является переменной-членом. Это означает, что указатель, переданный в качестве аргумента, также удаляется при вызове деструктора, но я не могу понять, почему. Я сделал небольшой фрагмент кода для предварительного просмотра моего вопроса.

class IWrite {
public:
    virtual void write(string) = 0;
};

class Consolerite : public IWrite
{
public:
    void write(string myString)
    {
        cout << myString;
    }
};

class OutPut
{
public:
    OutPut(IWrite* &writeMethod)
    {
        this->myWriteMethod = writeMethod;
    }
    ~OutPut() { delete this->myWriteMethod; }

    void Run(string Document)
    {
        this->myWriteMethod->write(Document);
    }

private:
    IWrite* myWriteMethod = NULL;
};

int main()
{
    IWrite* writeConsole = new Consolerite;
    OutPut Document(writeConsole);
    Document.Run("Hello world");
    system("pause");
}

При выходе из программы IWrite * writeConsole удаляется, но я не могу понять, почему. Может кто-нибудь помочь мне понять это. Спасибо.

1 Ответ

2 голосов
/ 10 апреля 2019

Вы не «удаляете указатель», вы удаляете объект, на который указывает указатель (то есть объект, созданный с помощью new Consolerite).И поскольку указатель пройден, а указатель на поле члена указывает на один и тот же объект, они оба станут недействительными, как только вы используете delete для любого из них.

Также эта программа имеет неопределенное поведение, так как вы удаляете объект, используяуказатель на базовый класс, у которого нет деструктора virtual.

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