Ошибки, когда деструктор удаляет массив - PullRequest
0 голосов
/ 24 марта 2012
class Celda
{
private:
    int* bloques_;
public:
    Celda(int size);
    ~Celda(){ delete [] bloques_; };
};
Celda :: Celda(int size)
{
    bloques_ = new int[size];
    bloq_ocupados_ = 0;
    tam_ = size;
    for(int i = 0 ; i < tam_ ; ++i){
        bloques_[i] = 0;
    }
}

Tabla :: Tabla(int numcel, int tambloq)
{
    nceldas_ = numcel; tam_bloque_ = tambloq;
    tabla_ = new Celda*[nceldas_];
    for(int i = 0 ; i < nceldas_ ; ++i){
        tabla_[i] = new Celda(tam_bloque_);
}
    ocupadas_ = 0;
}

Tabla :: ~Tabla()
{
    for(int i = 0 ; i < nceldas_ ; ++i){
        delete [] tabla_[i];
    }
    delete [] tabla_;
}

У меня есть это закодированное сейчас, 2 класса, Celda и Tabla, и когда я запускаю свою программу, она ставит в конец:

* Обнаружен glibc: free (): invalidad pointer: 0x0000000002391338 *

Отладчик слишком часто прекращает удаление указателя bloques_ (например, 30), вызывая деструктор.

В чем моя ошибка ??

1 Ответ

5 голосов
/ 24 марта 2012

Использование new / new [] должно совпадать с использованием delete / delete [].

В tabla_ [i] назначается новое, но освобождается при удалении [].

Измените его на

 delete tabla_[i];

, и оно будет работать.

...