Hola, estoy diseñando un programa en POO que lea calificaciones de alumnos de tres periodos y luego calcule su promedio. Quiero que cuando se lean las calificaciones aparezca en nombre de cada alumno, pero hay un problema con la memoria dinámica :S, aquí está mi código....
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <string.h>
#include <fstream.h>
class MATRIX;
class Alumnos
{
 private:
    int i,k, temp, m;
 public:
   int n; char **Arreglo;
   Alumnos(){n=0; m=0;}
   Alumnos(int F, int Long)
    {
      n=F;
      m=Long;
      Arreglo=new char *[n];
      for(i=0;i<=n;i++)
      Arreglo=new char [m];
    }
   void LeeCadena()
    {
      cout<<endl<<"El arreglo a ordenar es : "<<endl;
      for(i=1;i<=n;i++)
         {
           cout<<"Alumno "<<i<<" :";
            gets(Arreglo);
          }
    }
   void OrdenaCadena()
    {
      for(i=1;i<n;i++)
          for(k=1;k<n;k++)
        {
          temp=strcmp (Arreglo[k], Arreglo[k+1]);
            if(temp > 0)
            {
         strcpy (Arreglo[0],Arreglo[k]);
         strcpy (Arreglo[k],Arreglo[k+1]);
         strcpy (Arreglo[k+1],Arreglo[0]);
            }
        }
    }
       void GuardaCadena()
    {
      ofstream archivo;
      archivo.open("E:/Nombres.txt");
       for(i=1;i<=n;i++)
       archivo<<Arreglo<<endl;
       archivo.close();
    }
       void VerCadena()
    {
      // cout<<endl<<" Los nombres ordenados son: "<<endl;
       for(i=1;i<=n;i++)
       cout<<Arreglo<<endl;
    }
      void RecuperaCad()
      {
      ifstream archivo("E:/Nombres.txt");
      while (!archivo.eof())
      {
          for(i=0;i<=n;i++)
          archivo.getline(Arreglo,m);
      }
      }
      void LiberaMemoriaCad()
   {
     for (i=0; i<=n;i++)
          delete[]Arreglo;
          delete[]Arreglo;
   }
 
     friend class MATRIX;
};
class MATRIX
{
 private:
       int Fil, Col, i, j, x;
       double **M;
 public:
      MATRIX(){Fil=0; Col=0;}
      MATRIX(int F, int C)
      { Fil=F;
        Col=C;
      M=new double *[Fil];
         if(M==NULL)
              {cout<<"No hay MD";
               getch();
               exit(0);
            }
        for(i=0;i<Fil;i++)
         M=new double[Col];
        for(i=0;i<Fil;i++)
        if (M==NULL)
          {cout<<"No hay MD";
           getch();
           exit(0);
          }
        for(i=0;i<Fil;i++)
        for(j=0; j<Col; j++)
         M[j]=0.0;
      }
       Alumnos obj;
     // void LeeX(){cin>>x;}
      void Lee_Mtz()
          {
            cout<<"Alumno: ";
            obj.RecuperaCad();
            for(i=0;i<=obj.n;i++)
           cout<<obj.Arreglo;
              {
                 for(i=0;i<Fil;i++)
                 {
                   for(j=0;j<Col;j++)
                   {
                     cout<<"M["<<i<<"]["<<j<<"]= ";
                     cin>>M[j];
                    }
                 }
             }
           }
      void Ver_Mtz()
        {
           for(int i=0; i<Fil;i++)
             {cout<<endl;
              for(int j=0;j<Col;j++)
              cout<<M[j]<<"   ";
             }
        }
      void LiberaMem()
        {
         for(int i=0;i<Fil;i++)
          delete []M;
             delete []M;
         }
      void PromedioPorMateria()
        {
         for(int i=0; i<Fil;i++)
         for(int j=0;j<Col;j++)
            M[j]=(M[j])/3;
        }
      void GuardaParcial1()
        {
           ofstream archivo;
           archivo.open("E:/Parcial1.txt");
           for(i=0; i<Fil;i++)
         for(j=0; j<Col;j++)
         archivo<<M[j]<<endl;
         cout<<"Datos almacenados..."<<endl;
         archivo.close();
         }
      void GuardaParcial2()
      {
         ofstream archivo;
           archivo.open("E:/Parcial2.txt");
           for(i=0; i<Fil;i++)
         for(j=0; j<Col;j++)
         archivo<<M[j]<<endl;
         cout<<"Datos almacenados..."<<endl;
         archivo.close();
      }
      void GuardaParcial3()
      {
        ofstream archivo;
        archivo.open("E:/Parcial3.txt");
        for(i=0; i<Fil;i++)
         for(j=0; j<Col;j++)
            archivo<<M[j]<<endl;
      cout<<"Datos almacenados..."<<endl;
      archivo.close();
      }
      void GuardaPromedio()
      {
        ofstream archivo;
        archivo.open("E:/PromedioPorMateria.txt");
        for(i=0; i<Fil;i++)
         for(j=0; j<Col;j++)
         archivo<<M[j]<<endl;
      cout<<"Datos almacenados..."<<endl;
      archivo.close();
      }
      void RecuperaParcial1()
      {
         ifstream archivo("E:/Parcial1.txt");
           do
         {
            for (int i=0;i<Fil;i++)
            for (int j=0;j<Col;j++)
            archivo >> M[j];
         }while (!archivo.eof());
      }
      void RecuperaParcial2()
      {
        ifstream archivo("E:/Parcial2.txt");
         do
        {
          for (int i=0;i<Fil;i++)
          for (int j=0;j<Col;j++)
           archivo >> M[j];
        }while (!archivo.eof());
      }
      void RecuperaParcial3()
      {
         ifstream archivo("E:/Parcial3.txt");
              do
            {
            for (int i=0;i<Fil;i++)
               for (int j=0;j<Col;j++)
               archivo >> M[j];
            }while (!archivo.eof());
      }
      void RecuperaPromedio()
      {
      ifstream archivo("E:/PromedioPorMateria.txt");
        do
       {
         for (int i=0;i<Fil;i++)
         for (int j=0;j<Col;j++)
         archivo >> M[j];
         }while (!archivo.eof());
       }
      MATRIX operator+(MATRIX M1)
      {
       MATRIX ObjAux(Fil, Col);
        for(i=0; i<Fil;i++)
         for(j=0; j<Col;j++)
            ObjAux.M[j]=M[j]+M1.M[j];
       return ObjAux;
        }
};
void main()
{
 int F, C, Long;
C=6;
Long=50;
        cout<<"cuantas alumnos?   ";cin>>F;
       Alumnos Obj1(F, Long);
       MATRIX M1(F,C), M2(F,C), M3(F,C),M4(F,C), M5(F,C);
       Obj1.LeeCadena();
       Obj1.OrdenaCadena();
       Obj1.VerCadena();
       Obj1.GuardaCadena();
           M1.Lee_Mtz();
          M2.Lee_Mtz();
          M3.Lee_Mtz();
        M1.GuardaParcial1();
         M2.GuardaParcial2();
        M3.GuardaParcial3();
           M4=M1+M2;
          M5=M3+M4;
        M5.PromedioPorMateria();
        M1.Ver_Mtz();
          cout<<endl;
            M2.Ver_Mtz();
           cout<<endl;
           M3.Ver_Mtz();
          cout<<endl;
             M5.Ver_Mtz();
          cout<<endl<<endl;
       getch();
          M1.LiberaMem();
           M2.LiberaMem();
          M3.LiberaMem();
           M4.LiberaMem();
          M5.LiberaMem();
  }