Буквально //Here I need to have an ERROR!
, вот как вы это сделаете:
{
Queue q;
q.enqueue(1);
q.enqueue(2);
q.dequeue();
q.print();
}
q.print(); // THIS WILL PRODUCE AN ERROR
Похоже, вы неправильно понимаете время жизни объектов, выделенных из стека.Стековые объекты автоматически уничтожаются при выходе из области видимости.В этом примере область действия q
заканчивается на }
.
Вызывать деструктор самостоятельно почти всегда неправильно (я сталкивался ровно с одним единственным случаем, когда было нормально вызывать деструктор явно).Зачем?Примите во внимание следующее:
{
Queue q;
q.~Queue(); // DONT DO THIS !
}
Вы вызвали деструктор, но когда он выходит из области видимости, он снова уничтожается, и вы получаете неприятные ошибки времени выполнения.
Что вы делаете в своем коде:
Queue q;
q.~Queue();
q.print();
- это неопределенное поведение !
Также обратите внимание, что вызов деструктора - это еще не все, что происходит при удалении объекта.Когда выделенный объект стека удаляется, сначала вызывается его деструктор, а затем выделяемая память освобождается.Обычно вы не хотите вмешиваться в этот процесс и, к счастью, вам редко приходится это делать.
Как я могу удалить его (заставить его исчезнуть)?
Вы не можете заставить его "исчезнуть".Когда объект уничтожается, биты и байты в памяти не стираются.Это было бы ужасно неэффективно.На самом деле я думаю, что C free
имеет гораздо лучшее и менее запутанное имя.Память освобождается для последующего использования, она не стирается так, чтобы было невозможно прочитать то, что было раньше.
Для дальнейшего чтения я отсылаю вас к этому исчерпывающему ответу на несколько иной, но связанный вопрос: Можно ли получить доступ к памяти локальной переменной за пределами ее области видимости?
Также яПредлагаем вам прочитать о RAII , который основан на автоматическом вызове деструкторов.
TL; DR: Если вы хотите очистить Queue
, напишите:
q.clear();
q.print(); // prints an empty queue!
Никогда не вызывайте деструктор стекового объекта!Он будет вызван автоматически.