我正在将指针分配给类的构造函数中的指针。在析构函数中,我删除作为成员变量的指针。这意味着当调用析构函数时,作为参数传入的指针也会被删除,但我不明白为什么。我编写了一小段代码来预览我的问题。
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被删除,但我不明白为什么。有人可以帮助我理解这一点。谢谢。
答案 0 :(得分:2)
您不是要“删除指针”,而是要删除该指针指向的对象(即使用new Consolerite
创建的对象)。而且由于传递的指针和成员字段指针指向同一个对象,因此一旦在其中任何一个上使用delete
,它们都将无效。
该程序还具有未定义的行为,因为您正在使用指向没有virtual
析构函数的基类的指针来删除对象。