2011-06-12 49 views
0

我写在C此功能++作为一个更大计划的一部分删除两次:错误:调用同一个内存位置

Object Single_list<Object>::pop_front() { 
    //Single_node<Object> *tmp_front; 
    //Object hold; 
    if (empty()) { 
     throw underflow(); 
    } 

    Single_node<Object> first_node = front(); 
    Single_node<Object> *ptr = list_head;                
    list_head = list_head->next(); 
    delete ptr; 
    return first_node.retrieve(); 
} 

然而,当我尝试使用这个功能我得到以下信息:

WARNING: calling delete twice on the same memory location: 0x100100160

我真的很困惑,我没有删除指针(假设这是什么导致问题?)两次。

任何意见将不胜感激。

按照要求,这里的构造,为Single_Node检索功能,虽然我不知道这将是关于删除错误,我得到多大的帮助:

template <typename Object> 
Single_node<Object>::Single_node(const Object &e, Single_node<Object> *n):element(e), next_node(n) 
{ 
    // empty constructor 
} 

template <typename Object> 
Object Single_node<Object>::retrieve() const 
{ 
    return element; 
} 

template <typename Object> 
Single_node<Object> *Single_node<Object>::next() const 
{ 
    return next_node; 
} 
+0

如果这真的是唯一相关的代码,那么编译器是错误的。有时可能会出错。 – 2011-06-12 02:44:40

+2

...但几乎从不。 – 2011-06-12 02:47:53

+0

请发布一些显示问题的完整代码 – Mankarse 2011-06-12 02:49:36

回答

0

大厦Mankarse的评论,请尝试以下操作:

Object Single_list<Object>::pop_front() { 

    if (empty()) { 
     throw underflow(); 
    } 

    Object result = front().retrieve(); 

    Single_node<Object> *ptr = list_head; 
    list_head = list_head->next(); 
    delete ptr; 
    return result; 
} 

这会在第一个节点被删除之前抓取结果。

+0

嗨,感谢您的回复,但我已经将节点内容存储在保持变量中,然后返回此保持变量。所以,删除节点应该不会影响返回值... – rrazd 2011-06-12 06:33:20

+0

@rr“Single_node”是否有析构函数?这是做什么的? – 2011-06-12 11:11:39

+0

@rr:你确定'='执行深层复制?我真的不知道“对象”是什么;如果你将它存储在'Single_node'中,而不是引用,那么'Object'不能是多态的......并且名字暗示它是。 – 2011-06-12 14:00:07