2012-07-03 29 views
0

我在映射迭代器中出錯。問題如下:在類賦值時映射迭代器錯誤

class JacobianCol 
{ 
private: 
... 
    JacobianColData::iterator _L_begin; 
public: 
    JacobianColData::iterator L_begin(); 
... 
}; 

在另一個模塊:

JacobianCol LUSolver::col_subtract(const JacobianColData::iterator &alpha, JacobianCol &X, JacobianCol &Y) 
{ 
    JacobianCol result = Y; 

    //alternate "result" variable 

    return result; 
} 

電話:

... 
J[*it] = col_subtract(friend_element, J[diag_index], J[*it]); 
... 

當我指定的col_subtract結果J[*it]我得到J[*it].L_begin指向一個解除分配的內存(指向先前的J[*it])。

+3

不解決您的問題重新初始化迭代器,但與年初的名字下劃線後跟一個大寫字母以及以雙下劃線開頭的名字保留給C++實現。 –

+0

謝謝。我使用下劃線來區分私人,不受公衆的保護。我將在未來的項目中考慮您的建議 –

+0

您是否實現了您的副本構造函數(並正確賦值)?從你的片段中看不到這個簡單的問題.. – Nim

回答

0

JacobianCol有_col_data成員。即輸入實例JacobianCol Y有一個_col_data實例,並且該實例的_L_Begin用該映射的迭代器進行初始化。當您返回結果時,會創建一個不同的_col_data成員。現在,_L_Begin迭代器將從原始Y實例中複製。這就是你觀察到的行爲的原因。

要解決這個工具的拷貝構造函數,複製地圖,並通過顯式調用_col_data.begin()的拷貝構造函數

JacobianCol(const JacobianCol& aSrc_in) 
{ 
    _coll_data = aSrc_in._coll_data; 
    _L_Begin = _coll_data.begin(); 
} 
+0

謝謝。我正試圖實現這一點。我只是認爲有任何其他基於編譯器的方式:)謝謝 –

+0

不幸的是,編譯器無法知道你的迭代器需要以不同的方式「複製」。 – PermanentGuest

0

當你這樣做:

JacobianCol result = Y; 

result._L_begin保持指向Y._col_data.begin()。當Y被引用的對象被刪除時,result._L_begin保持指向那個現在無效的位置。

+0

是的,我已經想通了。我問的是如何管理這種情況。 –

+0

@DenisKharitonov我編輯了答案,使其更加清晰。 – fbafelipe