【发布时间】:2019-09-03 14:40:41
【问题描述】:
在下面的代码中,我明确地调用了~destructor()。但是,该对象仍然是可访问的。我怎样才能删除它(让它消失)?
class Queue {
public:
node* top = NULL;//points to the top of the queue
//methods:
void enqueue(int data);//adds a node to the queue
void dequeue();
//printing
void print();
//destructor
~Queue();
};
还有析构函数:
Queue::~Queue() {
//The destructor deletes all items from HEAP
//Then sets the top to 0
while (top != NULL)
this->dequeue();//dequeue until there are NO more items
top = 0;
}
在 Source.cpp 中:
Queue q;
q.enqueue(1);
q.enqueue(2);
q.enqueue(3);
q.enqueue(4);
q.dequeue();
q.dequeue();
q.print();
q.~Queue();
q.print();//Here I need to have an ERROR!
q.enqueue(7);//Here I need to have an ERROR!
q.print();//Here I need to have an ERROR!
输出是:
4 3 7
我预计会出错:
标识符“q”未定义
【问题讨论】:
-
很少有充分的理由显式调用析构函数。你所做的只是未定义的行为,你不能指望这样的错误信息。
-
调用析构函数不会删除标识符。访问已销毁的对象会调用 未定义的行为
-
q仍然存在。你所做的只是调用它的析构函数。即使q不在那里,您仍然可以访问它。调用未定义行为的结果是未定义的。 -
现实是相反的:你不应该在对象被销毁后访问它
-
这是XY issue?。您的目标是删除所有项目吗?如果是这样,那么您应该为此目的拥有一个
clear()成员函数,而不是尝试错误地调用析构函数来执行此操作。
标签: c++ oop destructor