2016-12-18 10 views
-5

assocTab::swap()のオブジェクトのisCaseSensitiveの値を変更できないのはなぜですか? isCaseSensitiveフィールドはassocTab()コンストラクタ内で初期化されます。 Valgrindの出力:クラスフィールドの値を変更するC++ - '条件付きジャンプまたは移動はユニット化された値に依存します'

==13666== Conditional jump or move depends on uninitialised value(s) 
==13666== at 0x401341: assocTab::setCaseSensitivity(bool) (assoctable.cpp:117) 
==13666== by 0x401157: assocTab::swap(assocTab&) (assoctable.cpp:68) 
==13666== by 0x4011C3: assocTab::operator=(assocTab const&) (assoctable.cpp:77) 
==13666== by 0x4015FE: main (main.cpp:21) 
==13666== 

私の方法および簡体クラスisCaseSensitiveが属する:

class assocTab{ 

private: 
    struct node{ 
     node* next; 
     char* key; 
     int val; 

    }; 
    node* head; 
    bool isCaseSensitive; 
    void clear(); 
    void swap(assocTab& l); 
public: 
    void setCaseSensitivity(bool); 
    bool getCaseSensitivity() const; 
}; 

assocTab::assocTab(){ 
    head = NULL; 
    setCaseSensitivity(true); 
} 
assocTab::assocTab(const assocTab& l){ 
    node *src, **dst; 
    head = NULL; 
    src = l.head; 
    dst = &head; 
    try{ 
     while(src){ 
      *dst = new node (*src); 
      src = src->next; 
      dst = &((*dst)->next); 
     } 
    }catch(...){ 
     clear(); 
     throw; 
    }; 
} 
void assocTab::swap(assocTab& l){ 

    bool swpCS = getCaseSensitivity(); 
    bool swpCS2 = l.getCaseSensitivity(); 
    l.setCaseSensitivity(swpCS); 
    setCaseSensitivity(swpCS2); //line 68 

    std::swap(l.head, head); 
} 
void assocTab::setCaseSensitivity(bool isCS){ 
    if(isCS) //line 117 
     isCaseSensitive = true; 
    else 
     isCaseSensitive = false; 
} 
bool assocTab::getCaseSensitivity() const{ 
    return isCaseSensitive; 
} 
assocTab& assocTab::operator= (const assocTab& l){ 
    if (&l == this) 
    return *this; 
    assocTab t(l); 
    swap(t); 

    return *this; 
} 
+0

'assocTab'のコンストラクタで' isCaseSensitive'を初期値に設定すると消えますか?他の人が問題を再現できるようにするには、[最小で完全で検証可能な例](http://stackoverflow.com/help/mcve)を含める必要があります。 –

+0

いいえ、そうではありません。 – Topkek

+1

あなたのvalgrind出力に演算子=()が記述されています。それはあなたが書いたものですか? –

答えて

0

あなたのコピーコンストラクタがisCaseSensitiveの値をコピーするためには表示されません。したがって、operator+()メソッドへの呼び出しが行われ、コピーコンストラクタでローカルコピーが作成された場合、ローカルコピーでスワップを呼び出すと、値は初期化されません。

関連する問題