2017-06-10 67 views
1

这里是我正在处理的LinkedList实现。它工作正常的任何数据类型,但是当我试图做出对与Visual Studio我得到指定RtlValidateHeap 无效地址调试链表 一种类型的链表(00790000,007B16D0)自定义链接列表创建RtlValidateHeap错误与具有链接列表的结构

问题出现代码如下:

typedef unsigned long int LENGTH_T; 
template < typename type > 
struct nodes 
{ 
    type _value; 
    nodes<type> * _next_node; 
    nodes() { _next_node = nullptr; } 
}; 

template < typename type > 
class LinkedList 
{ 
    nodes<type> * _elem_nodes; 
    LENGTH_T _size; 
public: 
    nodes<type> * node_at(LENGTH_T at); 
    type& operator[] (LENGTH_T at); 
    void push_back(const type src); 
    LENGTH_T size() const { return _size; } 
    LinkedList(); 
    ~LinkedList(); 
}; 

template<typename type> 
nodes<type>* LinkedList<type>::node_at(LENGTH_T at) { 
    if (at == 0) 
     return _elem_nodes; 
    else if (at > _size - 1 || _size == 0) { 
     PRINT_ERROR("try to access out of range"); 
    } 

    // tmp node for storing sequential nodes 
    nodes<type> * cur_tmp_node_ptr = _elem_nodes->_next_node; 

    for (size_t i = 1; i < at; i++) 
     cur_tmp_node_ptr = cur_tmp_node_ptr->_next_node; 

    return cur_tmp_node_ptr; 
} 

template<typename type> 
type & LinkedList<type>::operator[](LENGTH_T at) 
{ 
    return node_at(at)->_value; 
} 

template<typename type> 
void LinkedList<type>::push_back(const type src) 
{ 
    if (_size == 0) { 
     _elem_nodes->_value = src; 
     _size++; 
    } 
    else { 
     nodes<type> * new_node = new nodes<type> ; 
     new_node->_value = src; 
     new_node->_next_node = nullptr; 
     node_at(_size - 1)->_next_node = new_node; 
     _size++; 
    } 
} 

template<typename type> 
LinkedList<type>::LinkedList() 
{ 
    _size = 0; 
    _elem_nodes = new nodes<type>; 
    _elem_nodes->_value = type(); 
    _elem_nodes->_next_node = nullptr; 
} 

template<typename type> 
LinkedList<type>::~LinkedList() 
{ 
    if (_size > 1) // When size = 0 , so _size-1 = -1 but _size is unsigned; 
     for (LENGTH_T i = _size - 1; i > 0; i--) { 
      delete (node_at(i)); 
     } 
    delete (_elem_nodes); 
} 

这里是在规定的问题可以看出 FE

struct test { 
    int anything; 
}; 

struct test2 { 
    LinkedList<test> t; 
}; 

int main() 
{ 
    LinkedList<test2> t; 
    t.push_back(test2()); 
    t.push_back(test2()); 
    return 0; 
} 

的代码示例**编辑:我写了自定义Assig市民明白运营商和拷贝构造函数和没有得到这个错误了,但在测试2上面的例子()。t._next_node总是包含垃圾值而不是nullptr这我不理解为什么**

template<typename type> 
LinkedList<type>& LinkedList<type>::operator=(const LinkedList<type>& other) 
{ 
    if (&other == this) 
     return *this; 
    this->~LinkedList(); 
    this->_elem_nodes = nullptr; 
    _size = 0; 
    nodes<type> * cur_this_node = this->_elem_nodes; 
    nodes<type> * cur_other_node = other._elem_nodes; 
    while (cur_other_node != nullptr) 
    { 
     cur_this_node = new nodes<type>; 
     cur_this_node->_value = cur_other_node->_value; 
     this->_size++; 
     cur_this_node = cur_this_node->_next_node; 
     cur_other_node = cur_other_node->_next_node; 
    } 
    return *this; 
} 

template<typename type> 
LinkedList<type>::LinkedList(const LinkedList<type>& other) 
{ 
    _size = 0; 
    nodes<type> * cur_this_node = this->_elem_nodes; 
    cur_this_node = nullptr; 
    nodes<type> * cur_other_node = other._elem_nodes; 
    while (cur_other_node != nullptr) 
    { 
     cur_this_node = new nodes<type>; 
     cur_this_node->_value = cur_other_node->_value; 
     cur_this_node->_next_node = nullptr; 
     this->_size++; 
     cur_this_node = cur_this_node->_next_node; 
     cur_other_node = cur_other_node->_next_node; 
    } 
} 

回答

0

您有一个规则三次(或四次或五次)违规。你已经定义了一个自定义析构函数,但不是一个自定义赋值运算符。在你的情况下,这最终导致两个单独的LinkedList对象指向相同的节点。

更多信息:https://stackoverflow.com/a/4782927/951890

+0

我写的自定义赋值运算符,但仍然得到了同样的错误,请检查在第一篇文章,我编辑了与 – bluedragon

+0

@bluedragon的实现:你还缺少一个拷贝构造函数。 –

+0

好吧我成功(?)写道,它的工作原理我没有得到那个错误,但在由test2()创建的示例对象总是包含null值,而不是nullptr,因此我的循环变得无限,所以对于晚回复,我仍然是初学者 – bluedragon