但是当我删除linked_list时它不应该是下次不能打印的吗?
我在删除列表时使用new
和delete
创建了一个链接列表
sorted_list::~sorted_list()
{
// Destructor implementation
destroy(this->first);
cout << "Destructor called sorted_list" << endl;
}
void sorted_list::destroy(list_link* item)
{
if (item)
{
destroy(item->next);
delete item;
}
}
void sorted_list::print() {
if(this->first)
{
iteratorn *traverse = new iteratorn(this->first);
while( !traverse->iterator_end() )
{
cout << traverse->iterator_get_key() << " ";
traverse->iterator_next();
}
delete traverse;
}
else
cout << "list empty" << endl;
}
答案 0 :(得分:14)
访问被破坏的对象时,行为未定义。实际上,删除对象并不会清除内存,只是将其标记为可用,因此如果对已经删除的对象执行某些操作,它们可能会做一些合理的操作。但同样,该对象被破坏,因此您不能访问它。
当然,在破坏后,你不应该保留任何属于链表的对象的指针,因为这些对象也会被破坏。
顺便说一句,你的sorted_list::destroy
是递归的,这是非常低效的。您可能需要用迭代方法替换它:
void sorted_list::destroy(list_link* item)
{
while (item)
{
list_link* old = item;
item = item->next;
delete old;
}
}
(你应该考虑@Roger Pate的评论,而不是在致电this->first
后第二次删除destroy(this->first);
。)
答案 1 :(得分:0)
声明链接时,可能看起来或多或少像这样:
struct list_link {
int data;
list_link *next;
};
你可以在析构函数中删除:
struct list_link {
int data;
list_link *next;
~list_link() { delete next; } // MAKE SURE NULL-TERMINATED LIST
};
这种方式如果你想删除列表,你可以简单地:
delete first;
MAGIC !!
答案 2 :(得分:0)
缺少部分无效。删除后,您必须至少使第一个节点无效。删除后我会使每个节点无效。