Taking //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();
is 未定义的行为 https://en.cppreference.com/w/cpp/language/ub!
另请注意,调用析构函数并不是删除对象时发生的全部事情。当删除堆栈分配的对象时,首先调用其析构函数,然后释放分配的内存。通常您不想干扰此过程,幸运的是您很少需要这样做。
我怎样才能删除它(让它消失)?
你无法让它“消失”。当对象被销毁时,内存中的位和字节不会被删除。那将是非常低效的。其实我觉得Cfree
有一个更好、更不容易混淆的名字。内存被释放以供以后使用,它不会被擦除,以致无法读取之前的内容。
为了进一步阅读,我建议您参考这个略有不同但相关的问题的详尽答案:局部变量的内存可以在其作用域之外访问吗? https://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope?rq=1
另外,我建议您阅读有关RAII https://en.cppreference.com/w/cpp/language/raii它依赖于自动调用析构函数。
TL;DR:如果您想清除Queue
然后写:
q.clear();
q.print(); // prints an empty queue!
永远不要调用堆栈分配对象的析构函数!它将被自动调用。