2016-05-01 3 views
1

私はいくつかの動的に割り当てられた配列を扱っていますが、これは配列にある種の範囲の問題であることがわかりますが、何か分かりません。イテレータが最終的な関連するデータポイントに到達すると、その要素を指すポインタを逆参照すると毎回ジャンクが印刷されます。 m_dataはデータを保持する配列であり、コンテナテンプレートであるためT型です。どんな提案もいつものように高く評価されます。ここではいくつかの関連するスニペットです:Iterator最後の要素で "Junk"を返す

---From sorted.cpp--- 

template <class T> 
typename sorted<T>::const_iterator sorted<T>::insert(T data){ 

    if (m_size == m_capacity){  
    cout << "Resizing array." << endl; 
    resize(); 
    } 

    cout << "Adding " << data << " to array." << endl; 
    m_size++; 
    m_data[m_size - 1] = data; 
    if (m_size > 10){ // This test output works fine. 
    cout << "Array should be: " << endl; 
    for (int i = 0; i < 11; i++)  
     cout << m_data[i] << " "; 
    cout << endl; 
    } 

    return const_iterator(&m_data[m_size - 1]); 

} 

template <class T> 
void sorted<T>::resize(){ 

    int newCapacity = (2 * m_capacity); 
    T *temp_array = new T[newCapacity]; 

    for (int i = 0; i < m_capacity; i++) 
    temp_array[i] = m_data[i]; 

    T *m_data = temp_array; 
    delete [] temp_array; 
    setCap(newCapacity); 

} 

---From test file--- 

int main() { 

    sorted<int> x; 
    sorted<int>::const_iterator itr; 

    // append some values into my_array x 
    for (int i = 1; i < 12 ; i++) 
    x.insert((i*i) % 19); 

    // my_array does not keep items in order 
    cout << "my_array x:" << endl; 
    for (itr = x.begin(); itr != x.end(); itr++) 
    cout << *itr << " "; 
    cout << endl << endl; 

    return 0; 
} 
+0

イテレーターは正常に動作していますか? –

+2

'T * m_data = temp_array;' - 真剣に言えば、そのメンバ関数に**宣言されていません**。かなり確かに 'm_data = temp_array;'はもっとうまくいくでしょう。 – WhozCraig

+0

WhozCraig - あなたが正しいと思います。今私はm_dataで私の間違いを認識した。 – swingonaspiral

答えて

2

あなたのサイズ変更は疑わしい:あなたは新しい配列に古いデータをコピーした上で

void sorted<T>::resize(){ 

    int newCapacity = (2 * m_capacity); 
    T *temp_array = new T[newCapacity]; 

はそうtemp_arrayが新しいサイズ

for (int i = 0; i < m_capacity; i++) 
    temp_array[i] = m_data[i]; 

で新しい配列である

T *m_data = temp_array; 
    delete [] temp_array; 

ここで(上記のコードで)temp_arrayを削除しますあなたの新しい配列です。だから、修正はに上記交換することです:

delete [] m_data; 
    m_data = temp_array; 
+0

はい、ありがとうございます!私は割り当て解除がすべて間違っていると思いました、明らかに。まだ初心者はここでポインタで苦労しています。ありがとう、トン! – swingonaspiral

+0

@swing 'unique_ptr 'を使ってみてください - リソースの追跡作業はずっと少なくて済みます。また、場合によっては生の 'T *'コードが代わりにUBにつながるとすぐにエラーを生成します。 – Yakk

0

私はちょうどM_DATAが動的に割り当てられた配列へのポインタではなく、配列そのものではないことに気づきました。それが私の問題でした。 はfacedesk

1

あなたはリサイズで変数M_DATAを定義している()あなたが本当にクラッセのM_DATAを使用したいとき。

関連する問題