elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error con memoria dinámica en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error con memoria dinámica en C++  (Leído 2,530 veces)
Vivisnai

Desconectado Desconectado

Mensajes: 22


Ver Perfil
Error con memoria dinámica en C++
« 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.  


En línea

Vivisnai

Desconectado Desconectado

Mensajes: 22


Ver Perfil
Re: Error con memoria dinámica en C++
« Respuesta #1 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.



En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Error con memoria dinámica en C++
« Respuesta #2 en: 29 Febrero 2016, 09:49 am »

Me parece que no puedes porque intentas acceder a miembros privados del objeto al que copias.
En línea

Vivisnai

Desconectado Desconectado

Mensajes: 22


Ver Perfil
Re: Error con memoria dinámica en C++
« Respuesta #3 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Asignacion Dinamica Memoria
Programación C/C++
charmedever 5 3,783 Último mensaje 21 Octubre 2011, 05:25 am
por charmedever
Memoria dinámica
Programación C/C++
eleon 6 5,117 Último mensaje 24 Enero 2012, 22:17 pm
por Eternal Idol
[SOLUCIONADO] C++ - Error con memoria dinámica: ¿Puntero por referencia?
Programación C/C++
xaps 7 6,129 Último mensaje 22 Noviembre 2013, 17:16 pm
por lapras
Memoria dinamica? « 1 2 »
Programación C/C++
vangodp 11 5,879 Último mensaje 30 Abril 2014, 12:35 pm
por vangodp
Memoría dinámica
Programación C/C++
Developer Diego 4 2,742 Último mensaje 20 Mayo 2014, 23:10 pm
por Developer Diego
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines