0

配列の末尾に値を挿入するテンプレート化された関数を作成しようとしていますが、何をしようとしてもセグ フォールトが発生し続けます。アドバイスをいただければ幸いです。

template <typename T> 
void ArrayList<T>::insert_back(const T& x)
{
   if(m_size == m_max)
   {
      m_max = m_max*2; //resize array
      T* P = new T[m_max];
      for(int y = 0; y < m_size; y++) //copying array
      {
         P[y] = m_data[y];
      }
      delete[] m_data; //copy done delete
      m_data = P;
      P[m_size] = x; //gdb segfault -- caused by accessing P[m_size]
      m_size ++;
   }
   else // no resizing
   {
     m_data[m_size] = x;
     m_size++;
   }
}
4

1 に答える 1

0

m_dataを正しく初期化m_sizeしていれば、投稿したコードは機能しますm_max実際、ここでテスト バージョンを作成しましたが、エラーなしで実行されます。簡単に言えば、構造体に配置しました。これは、書きやすくするためだけでした。また、符号付き値と符号なし値の比較に関する警告を回避するために、ループ変数を size_t に変更しました。

これを考えると、最も可能性の高い問題は、初期メモリを割り当てていないことです。m_sizeゼロに初期化するm_max必要があり、ゼロより大きい必要があります (そして、割り当てられたメモリの量と一致する必要がありますm_max) 2*m_max

于 2013-02-13T06:54:22.103 に答える