2013-02-13 2 views
0

Я пытаюсь создать шаблонную функцию, которая будет вставлять значение в конец массива, однако я продолжаю работать с ошибкой seg независимо от того, что я пытаюсь сделать. Любые советы будут очень признательны.Templated Insert at End Function

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

Что 'm_size',' m_max' и 'm_data' инициализирован? – JaredC

ответ

0

код вы опубликовали работу, при условии, что вы правильно инициализированы m_data, m_size и m_max. Фактически, я создал тестовую версию here и работает без ошибок. Для упрощения я поместил его в структуру, это было только для того, чтобы мне было легче писать. Кроме того, я изменил вашу переменную цикла на size_t, чтобы избежать предупреждений о сравнении значений signed и unsigned.

Учитывая это, наиболее вероятная проблема заключается в том, что вы не выделили начальную память. m_size должен быть инициализирован в ноль и m_max потребности быть больше нуля (и соответствовать объему выделенной памяти), в противном случае новый вычисленный m_max будет 2*m_max, который по-прежнему 0.