在构造函数中参数化指针

时间:2019-04-10 09:28:05

标签: c++ pointers

我正在将指针分配给类的构造函数中的指针。在析构函数中,我删除作为成员变量的指针。这意味着当调用析构函数时,作为参数传入的指针也会被删除,但我不明白为什么。我编写了一小段代码来预览我的问题。

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 个答案:

答案 0 :(得分:2)

您不是要“删除指针”,而是要删除该指针指向的对象(即使用new Consolerite创建的对象)。而且由于传递的指针和成员字段指针指向同一个对象,因此一旦在其中任何一个上使用delete,它们都将无效。

该程序还具有未定义的行为,因为您正在使用指向没有virtual析构函数的基类的指针来删除对象。