Ayuda con destructor en c++

Hola estoy haciendo un ejercicio de examen que no me sale y voy a postearlo para que me ayudeis.
El problema consiste en realizar el constructor y destructor además de otros metodos, pero yo tengo el problema en el destructor de esta clase:
tablero.h
#ifndef _TABLERO_H_
#define _TABLERO_H_
struct Celda{
   Celda *sig;
   char pieza;
};
class Tablero{
private:
   char **tablero;
   Celda *perdidas;
   bool turnoblancas;
public:
   Tablero();
   ~Tablero();
   Tablero(const Tablero& t);
   Tablero& operator=(const Tablero& t);
   bool Mover(char co,int fo,char cd,int fd);
   void escribir();
};
#endif


tablero.cpp
#include <iostream>
#include "tablero.h"
using namespace std;

Tablero::Tablero(){
   tablero=new char*[8];
   for(int i=0;i<8;++i)
      tablero[i]=new char[8];
   tablero[0][0]=tablero[0][7]='T';
   tablero[0][1]=tablero[0][6]='C';
   tablero[0][2]=tablero[0][5]='A';
   tablero[0][3]='D';
   tablero[0][4]='R';
   for(int i=0;i<8;i++){
      tablero[1][i]='P';
      tablero[6][i]='P';
   }
   tablero[7][0]=tablero[7][7]='t';
   tablero[7][1]=tablero[7][6]='c';
   tablero[7][2]=tablero[7][5]='a';
   tablero[7][3]='d';
   tablero[7][4]='r';
   for(int i=2;i<6;i++)
      for(int j=0;j<8;j++)
         tablero[i][j]='v';

   perdidas=0;
   turnoblancas=true;
}

Tablero::~Tablero(){
   for(int i=0;i<8;i++)   //Borrado de la matriz de letras
      delete[] tablero[i];
   delete[] tablero;
   Celda *aux1=perdidas,*aux2;
   while(aux1->sig!=0){//Borrado de las piezas perdidas
      aux2=aux1->sig;
      delete aux1;
      aux1=aux2;
   }
   delete aux1;
   perdidas=0;
}
Tablero::Tablero(const Tablero& t){
   turnoblancas=t.turnoblancas;
   tablero=new char*[8];// Tablero apunta a un vector de 8 elementos del tipo char*
   for(int i=0;i<8;++i)
      tablero[i]=new char[8]; //Cada elemento del anterior vector apunta ahora a un vector de 8 char
   for(int i=0;i<8;++i)
      for(int j=0;j<8;++j)
         tablero[i][j]=t.tablero[i][j];//Copiamos los valores
   Celda *aux1,*aux2=t.perdidas;
   if(aux2->sig!=0){
      aux1=perdidas=new Celda;
      while(aux2->sig!=0){
         aux1->pieza=aux2->pieza;
         aux1->sig=new Celda;
         aux1=aux1->sig;
         aux2=aux2->sig;
      }
      aux1->pieza=aux2->pieza;
      aux1=0;aux2=0;
      delete aux1;delete aux2;
   }
   else{
      perdidas->sig=0;
      perdidas->pieza=t.perdidas->pieza;
   }
}
Tablero& Tablero::operator=(const Tablero& t){
   if(t.tablero!=0){
      for(int i=0;i<8;i++)
         delete[] tablero[i];
      delete[] tablero;
      tablero=new char*[8];
      for(int i=0;i<8;i++)
         tablero[i]=new char[8];
      for(int i=0;i<8;i++)
         for(int j=0;j<8;j++)
            tablero[i][j]=t.tablero[i][j];
   }
   else
      tablero=0;
   if(t.perdidas->sig!=0){
      Celda *aux1=t.perdidas,*aux2;
      aux2=perdidas=new Celda;
      while(aux1->sig!=0){
         aux2->pieza=aux1->pieza;
         aux2->sig=new Celda;
         aux2=aux2->sig;
         aux1=aux1->sig;
      }
      aux2->pieza=aux1->pieza;
      aux2->sig=0;
   }
   else
      perdidas=0;
   turnoblancas=t.turnoblancas;
   return *this;
}
bool Tablero::Mover(char co,int fo,char cd,int fd){
   bool band=true;
   //band=EsPosible(co,fo,cd,fg);
   if(band=true){
      char letra='a';
      char cad[8];
      cad[0]=letra;
      for(int i=1;i<8;i++){
         letra=letra+1;
         cad[i]=letra;
      }
      bool b=true;
      int x,y,cont=0;
      while(b==true){
         if(cad[cont]==co){
            x=cont;
            b=false;
         }
         cont++;
      }
      cont=0;b=true;
      while(b!=false){
         if(cad[cont]==cd){
            y=cont;
            b=false;
         }
         cont++;
      }
      tablero[y][fd]=tablero[x][fo];
   }
   return band;
}

void Tablero::escribir(){
   for(int i=0;i<8;i++){
      cout<<endl;
      for(int j=0;j<8;j++)
         cout<<tablero[i][j]<<" ";
   }
}



Y el programa de ejemplo que los utiliza:

ajedrez.cpp
#include <iostream>
#include "tablero.h"
using namespace std;

int main(){
   Tablero t,x;
   t.escribir();
   x.escribir();
   t=x;
}


El ejercicio consiste en hacer un tablero de 8*8 que va a simular ser un tablero de ajedrez. En el constructor se inicializa dicho tablero. Las piezas que se van eliminando se van a guardar en una lista enlazada y aquí es donde creo que esta el fallo en el destructor, lo he modificado varias veces pero no consigo que no me de una violación.

Os adjunto los archivos y un make por si queréis compilarlo

Adjuntos

En
Tablero& Tablero::operator=(const Tablero& t){
....
}

donde dice
if(t.perdidas->sig!=0){
debería decir
if(t.perdidas!=0){

O algo similar.

Salud.
1 respuesta