2017-06-10 5 views
1

ここには私が取り組んでいるLinkedList実装があります。それは、任意のデータ型のため正常に動作しますが、私はRtlValidateHeap(0079万、007B16D0)に指定された 無効なアドレスを得たVisual Studioにデバッグをリンクリスト を持っているタイプのリンクリストを作成しようとすると、問題が発生カスタムリンクリストリンクリストを持つ構造体でRtlValidateHeapエラーが発生しました

コードは次のようになります。私はカスタムAssigを書いた:ここ

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; 
} 

** EDIT観察することができますnment演算子とコピーコンストラクタとないTEST2にはもうなく、上記の例では、そのエラーを取得()。t._next_nodeは常に**

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

あなたがルールを持っている理由私は理解しておりませんというしnullptrジャンク値が含まれています3回(または4回または5回)違反のカスタムデストラクタを定義しましたが、カスタム代入演算子は定義していません。あなたの場合、これは2つの別々のLinkedListオブジェクトが同じノードを指し示すようになります。

さらに詳しい情報:https://stackoverflow.com/a/4782927/951890

+0

私はカスタム代入演算子を書きましたが、それでも最初のポストでそれを確認してください同じエラーを得た、私はその – bluedragon

+0

@bluedragonの実装とそれを編集した:あなたはまた、コピーコンストラクタが欠落しています。 –

+0

大丈夫私は正常に(?)それを書いて、私はそのエラーを取得しませんが、test2()によって作成されたオブジェクトの例では、nullptrではなくnullptrを含むので、私のループは無限に行くので、初心者 – bluedragon

関連する問題