2014-02-09 4 views
0

ошибка двойного освобождения или повреждения (fasttop).деконструктор для пользовательского класса векторов

Я работаю над созданием класса векторов с нуля и смущен с помощью деконструктора.

класс является:

template <class T> 
class Vector 
{ 
public: 
    typedef T * iterator; //pointer to type T 

    Vector();        
    ~Vector();      

    void reserve(unsigned int capacity); 
    void resize(unsigned int size);  

private: 
    unsigned int my_size; 
    unsigned int my_capacity; 
    T * buffer; 
}; 

template <class T> 
Vector<T>::Vector() 
{ 
my_size = 0; 
my_capacity = 0; 
buffer = 0; 
} 

template <class T> 
Vector<T>::~Vector(){ 
    delete [] buffer; 
    my_size = my_capacity = 0; 
} 

template <class T> 
void Vector<T>::reserve(unsigned int new_capacity){ 
    int * new_buffer = new T[new_capacity]; 
    for(int i=0; i<my_size;i++){ 
     new_buffer[i] = buffer[i]; 
    } 
    my_size += new_capacity; 
    my_capacity += new_capacity; 
    buffer = new_buffer; 
    delete new_buffer; 
} 

template <class T> 
void Vector<T>::resize(unsigned int new_size){ 
    //if new_size < size, change size. 
    if(new_size < size) 
    { 
     size = new_size; 
    } else { 
     if(new_size > my_capacity){ //increase capacity for larget size 
      while(my_capacity < new_size){ 
       reserve(my_capacity+5); 
      } 
     } 
     for(int i = my_size; i < new_size; i++){ 
      buffer[i] = T(); 
     } 
     my_size = new_size; 
    } 
} 

телефонный код:

int main() 
{ 
    Vector<int> v; 
    v.reserve(2); 
    assert(v.capacity() == 2); 
    cout << "SUCCESSFUL!!!\n"; 
} 

Я получаю успешный выход, но это когда Разрушитель называется, что я получаю ошибку я считаю.

+1

Нам нужно больше кода, чтобы это определить проблему. Покажите нам класс и покажите нам, как вы используете класс, пожалуйста. – 0x499602D2

+0

Еще лучше показать полный образец кода (включая основную функцию), который компилирует и демонстрирует проблему. –

+0

Извините, я делаю это, чтобы учиться. Не захотелось публиковать слишком много кода в случае, если ошибка не была в деконструкторе, тогда мне нужно будет продолжать искать. –

ответ

0

Ваша резервная функция не подходит по ряду причин. Вместо этого переместите последнюю строку этой функции до buffer = new_buffer и измените ее на delete [] buffer. Вам нужно удалить то, что раньше было в векторе, прежде чем назначать ему новые данные. Как это записано, вы назначаете новый буфер (теряете следы старого буфера), а затем удаляете все данные из нового буфера. Итак, когда деконструктор попадает, вы удаляете указатель на ничего.

Смежные вопросы