Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Vivisnai en 28 Febrero 2016, 13:10 pm



Título: Error con memoria dinámica en C++
Publicado por: Vivisnai en 28 Febrero 2016, 13:10 pm
Buenas tardes, estaba terminando una práctica de la universidad cuando me he encontrado con un fallo que no consigo solventar, he intentado repetirla de 0 pero me encuentro con el mismo fallo.

La práctica consiste en hacer una especie de programa de listas recordatorio, como Google Keep, utilizando memoria dinámica.

Pues bien, ahora mismo tal y como lo tengo al crear dos listas seguidas no da ningún fallo, pero si quiero crear una lista habiendo creado items dentro de cualquier lista, el programa me crashea.

Por ejemplo:

1. Comprar
2. Estudiar
No falla

1. Comprar
          1.          Queso
2. Estudiar
Falla al crear la lista Estudiar.


Aunque el resto de programa ya implementado en el código principal, el error se sitúa aquí, ya no sé que hacer, seguro que es una tontería, pero no la encuentro:

Código
  1. #include <iostream>
  2. #include <windows.h>
  3.  
  4. using namespace std;
  5.  
  6. class Item{
  7. private:
  8.    string Nombre;
  9.    bool Estado;
  10. public:
  11.  
  12.    Item(){
  13.        Nombre = "";
  14.        Estado = true;
  15.        return;
  16.    }
  17.  
  18.    Item(const Item &original){
  19.        Nombre = original.Nombre;
  20.        Estado = original.Estado;
  21.  
  22.        return;
  23.    }
  24.  
  25.    void NuevoItem(string nomItem){
  26.        Nombre = nomItem;
  27.        Estado = false;
  28.  
  29.        return;
  30.    }
  31.  
  32.    void MostrarItem(){
  33.        cout << Nombre << endl;
  34.    }
  35.  
  36.    void operator =(Item origen){
  37.        Nombre = origen.Nombre;
  38.        Estado = origen.Estado;
  39.  
  40.        return;
  41.    }
  42. };
  43.  
  44. class Lista{
  45. private:
  46.    string Nombre;
  47.    Item *vItems;
  48.    int nItems;
  49.  
  50. public:
  51.  
  52.    Lista(){
  53.        Nombre = "";
  54.        vItems = NULL;
  55.        nItems = 0;
  56.        return;
  57.    }
  58.  
  59.    Lista(const Lista &original){
  60.        Nombre = original.Nombre;
  61.        nItems = original.nItems;
  62.        for(int i=0;i<nItems;i++)vItems[i] = original.vItems[i];
  63.        return;
  64.    }
  65.  
  66.    void CrearLista(string nomLista){
  67.  
  68.        Nombre = nomLista;
  69.  
  70.        return;
  71.  
  72.    }
  73.  
  74.    void mostrarLista(){
  75.        cout << Nombre << endl;
  76.        for(int i=0; i<nItems; i++){
  77.            cout << "\t" << i+1;
  78.            vItems[i].MostrarItem();
  79.        }
  80.        return;
  81.    }
  82.  
  83.    void operator =(Lista origen){
  84.        Nombre = origen.Nombre;
  85.        nItems = origen.nItems;
  86.        for(int i=0;i<nItems;i++)vItems[i] = origen.vItems[i];
  87.        return;
  88.    }
  89.  
  90.    void crearItem(){
  91.  
  92.        string nomItem;
  93.        cout << "Especifique el nombre del item a crear: ";
  94.        cin >> nomItem;
  95.  
  96.        Item *aux = new Item[nItems+2];
  97.  
  98.        for(int i=0; i<nItems; i++) aux[i] = vItems[i];
  99.        delete []vItems;
  100.  
  101.        vItems = aux;
  102.        aux = NULL;
  103.  
  104.        vItems[nItems].NuevoItem(nomItem);
  105.        nItems++;
  106.  
  107.        return;
  108.    }
  109.  
  110. };
  111.  
  112. class ToDo{
  113.  
  114. private:
  115.    Lista *vListas;
  116.    int nListas;
  117.  
  118. public:
  119.  
  120.    ToDo(){
  121.        vListas = NULL;
  122.        nListas = 0;
  123.        return;
  124.    }
  125.  
  126.    ToDo(const ToDo &original){
  127.  
  128.        nListas = original.nListas;
  129.  
  130.        for(int i=0; i<nListas; i++) vListas[i] = original.vListas[i];
  131.  
  132.        return;
  133.  
  134.    }
  135.  
  136.    void CrearLista(){
  137.  
  138.        string nomLista;
  139.        cout << "Especifique el nombre de la lista a crear: ";
  140.        cin >> nomLista;
  141.  
  142.        Lista *aux = new Lista[nListas+2];
  143.  
  144.        for(int i=0; i<nListas; i++)aux[i] = vListas[i];
  145.        delete []vListas;
  146.  
  147.        vListas=aux;
  148.        aux=NULL;
  149.  
  150.        vListas[nListas].CrearLista(nomLista);
  151.        nListas++;
  152.  
  153.        return;
  154.  
  155.    }
  156.  
  157.    void MostrarListas(){
  158.        for(int i=0; i<nListas; i++){
  159.            cout << i+1 << " ";
  160.            vListas[i].mostrarLista();
  161.        }
  162.        return;
  163.    }
  164.  
  165.    void CrearItem(){
  166.  
  167.        int numLista;
  168.        cout << "Seleccione lista para crear item: ";
  169.        cin >> numLista;
  170.  
  171.        vListas[numLista-1].crearItem();
  172.  
  173.        return;
  174.    }
  175.  
  176.    ~ToDo(){
  177.        delete []vListas;
  178.        return;
  179.    }
  180.  
  181. };
  182.  
  183. class Menu{
  184.  
  185. private:
  186.    ToDo ToDoPractica;
  187.    bool RepetirBucle;
  188.  
  189. public:
  190.  
  191.    Menu(){
  192.        RepetirBucle = true;
  193.        return;
  194.    }
  195.  
  196.    void Mostrar(){
  197.  
  198.        int opcion;
  199.  
  200.        cout << ":::...ToDo...:::" << endl;
  201.        ToDoPractica.MostrarListas();
  202.  
  203.        cout << endl << ":::...Menu...:::" << endl;
  204.        cout << "1) Nueva lista" << endl;
  205.        cout << "2) Nuevo item" << endl;
  206.        cout << "3) Validar item" << endl;
  207.        cout << "4) Purgar validados" << endl;
  208.        cout << "5) Terminar" << endl;
  209.  
  210.        cout << "Seleccione opcion: ";
  211.        cin >> opcion;
  212.  
  213.        switch(opcion){
  214.        case 1: ToDoPractica.CrearLista(); break;
  215.        case 2: ToDoPractica.CrearItem(); break;
  216.        case 3: //ToDoPractica.ValidarItem(); break;
  217.        case 4: //ToDoPractica.PurgarValidados(); break;
  218.        case 5: //RepetirBucle = false; break;
  219.        default:
  220.            cout << endl << "Error: La opcion seleccionada no existe.";
  221.            Sleep(1200);
  222.            break;
  223.        }
  224.  
  225.    }
  226.  
  227.    bool getRepetirBucle(){
  228.        return(RepetirBucle);
  229.    }
  230.  
  231. };
  232.  
  233. void FuncionPractica1(){
  234.  
  235.    Menu MenuPractica;
  236.  
  237.    while(MenuPractica.getRepetirBucle()){
  238.        system("cls");
  239.        MenuPractica.Mostrar();
  240.    }
  241.  
  242.    return;
  243.  
  244. }
  245.  
  246. int main(){
  247.  
  248.    FuncionPractica1();
  249.  
  250.    return 0;
  251.  
  252. }
  253.  
  254.  
  255.  


Título: Re: Error con memoria dinámica en C++
Publicado por: Vivisnai en 28 Febrero 2016, 16:14 pm
¡Solucionado! El error es que al copiar los items de las listas de una lista a otra el acceso no se permite, no entiendo por qué, pero lo he solucionado que al copiar las listas se copien las direcciones en lugar de los elementos.



Título: Re: Error con memoria dinámica en C++
Publicado por: MAFUS en 29 Febrero 2016, 09:49 am
Me parece que no puedes porque intentas acceder a miembros privados del objeto al que copias.


Título: Re: Error con memoria dinámica en C++
Publicado por: Vivisnai en 1 Marzo 2016, 20:20 pm
Me parece que no puedes porque intentas acceder a miembros privados del objeto al que copias.

No, no era eso, ya que estamos hablando de objetos de la misma clase, lo que ocurría, que fui a preguntarle al profesor de programación, es que no reservaba memoria nueva para la copia del vector.