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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con punteros (en C++) (Actualizacion constante con nuevas preguntas)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con punteros (en C++) (Actualizacion constante con nuevas preguntas)  (Leído 2,336 veces)
DarkSorcerer

Desconectado Desconectado

Mensajes: 69



Ver Perfil
Ayuda con punteros (en C++) (Actualizacion constante con nuevas preguntas)
« en: 17 Septiembre 2013, 03:24 am »

Bueno, soy novato, espero que me puedan ayudar.

Estoy haciendo algunos ejercicios con punteros, cree una clase llamado "Auto" cuyos atributos son la marca, su patente (matricula) y el kilometraje, y en el main hice lo siguiente, cree 2 autos con asignacion automatica y 1 de forma dinamica, pero al momento de que se deben destruir al final del programa, me sale "RUN FAILED", ¿ a que se debera ?, yo en el destructor implemente de tal manera que informe de que se esta destruyendo el objeto.

Les dejo el codigo. Es probable que use este mismo tema para hacer consultas, mi proximo objetivo es practicar con listas enlazadas, ya tengo experiencia pero en Java, pero ahora quiero practicar con punteros.

NOTA 1: Cuando vean el codigo cuando el puntero auto3 apunta a auto2, ¿que sucede con los datos donde apuntaba auto3? , ¿ quedan para siempre en la memoria (a no ser que se reinicie) y tengo que usar delete ?

NOTA 2: Si tengo algun error o tienen una sugerencia, estaria agradecido que me lo dijeran.

Código:
Datos del auto 1

Marca:
Patente:
Kilometraje: 0

Datos del auto 2

Marca: Chevrolet
Patente: ASDF
Kilometraje: 300

Datos del auto3

Marca: Nissan
Patente: QWERT
Kilometraje: 500

Las direcciones de memoria de los autos son:

La direccion de memoria de auto 1 es: 0x22abe8
La direccion de memoria de auto 2 es: 0x22abd0
La direccion de memoria de auto 3 es: 0x22abcc

Ahora, auto3 va a apuntar a la direccion de auto2

La direccion de memoria de auto 3 es: 0x22abd0
La marca es: Chevrolet

Ahora, auto3 va a apuntar a la direccion de auto1

La direccion de memoria de auto 3 es: 0x22abe8
La marca es:


RUN FAILED (exit value 1,, total time: 734ms)




Código
  1. #include "Auto.h"
  2. #include <string>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. Auto::Auto() {
  8.  
  9.    marca = "";
  10.    patente = "";
  11.    kilometraje = 0;
  12.  
  13. }
  14.  
  15. Auto::Auto(string m, string p, double k){
  16.  
  17.    marca = m;
  18.    patente = p;
  19.    kilometraje = k;
  20.  
  21. }
  22.  
  23. Auto::Auto(const Auto& orig) {
  24. }
  25.  
  26. Auto::~Auto() {
  27.  
  28.    cout <<"\nDestruyendo el auto ...";
  29.  
  30. }
  31.  
  32. string Auto::getMarca(){
  33.  
  34.    return marca;
  35.  
  36. }
  37.  
  38. string Auto::getPatente(){
  39.  
  40.    return patente;
  41.  
  42. }
  43.  
  44. double Auto::getKilometraje(){
  45.  
  46.    return kilometraje;
  47.  
  48. }
  49.  
  50.  

Código
  1. #ifndef AUTO_H
  2. #define AUTO_H
  3. #include <string>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. class Auto {
  9. public:
  10.    Auto();
  11.    Auto(string m, string p, double k);
  12.    Auto(const Auto& orig);
  13.    virtual ~Auto();
  14.    string getMarca();
  15.    string getPatente();
  16.    double getKilometraje();
  17. private:
  18.    string marca;
  19.    string patente;
  20.    double kilometraje;
  21. };
  22.  
  23. #endif /* AUTO_H */
  24.  
  25.  

Código
  1. #include <cstdlib>
  2. #include "Auto.h"
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. int main(int argc, char** argv) {
  8.  
  9.    Auto auto1;
  10.    Auto auto2("Chevrolet","ASDF",300);
  11.    Auto *auto3 = new Auto("Nissan","QWERT",500);
  12.  
  13.    cout <<"Datos del auto 1\n";
  14.    cout <<"\nMarca: " << auto1.getMarca();
  15.    cout <<"\nPatente: " << auto1.getPatente();
  16.    cout <<"\nKilometraje: " << auto1.getKilometraje();
  17.    cout <<"\n\n";
  18.  
  19.    cout <<"Datos del auto 2\n";
  20.    cout <<"\nMarca: " << auto2.getMarca();
  21.    cout <<"\nPatente: " << auto2.getPatente();
  22.    cout <<"\nKilometraje: " << auto2.getKilometraje();
  23.    cout <<"\n\n";
  24.  
  25.    cout <<"Datos del auto3\n";
  26.    cout <<"\nMarca: " << auto3->getMarca();
  27.    cout <<"\nPatente: " << auto3->getPatente();
  28.    cout <<"\nKilometraje: " <<auto3->getKilometraje();
  29.  
  30.    cout <<"\n\nLas direcciones de memoria de los autos son:\n";
  31.    cout <<"\nLa direccion de memoria de auto 1 es: " << &auto1;
  32.    cout <<"\nLa direccion de memoria de auto 2 es: " << &auto2;
  33.    cout <<"\nLa direccion de memoria de auto 3 es: " << &auto3;
  34.  
  35.    cout <<"\n\nAhora, auto3 va a apuntar a la direccion de auto2\n";
  36.    auto3 = &auto2;
  37.    cout <<"\nLa direccion de memoria de auto 3 es: "<< auto3;
  38.    cout <<"\nLa marca es: "<< auto3->getMarca();
  39.  
  40.    cout <<"\n\nAhora, auto3 va a apuntar a la direccion de auto1\n";
  41.    auto3 = &auto1;
  42.    cout <<"\nLa direccion de memoria de auto 3 es: "<< auto3;
  43.    cout <<"\nLa marca es: "<< auto3->getMarca();
  44.    cout <<"\n";
  45.  
  46.    delete auto3;
  47.  
  48.    return 0;
  49.  
  50. }
  51.  
  52.  


« Última modificación: 17 Septiembre 2013, 11:35 am por DarkSorcerer » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Ayuda con punteros (en C++)
« Respuesta #1 en: 17 Septiembre 2013, 08:45 am »

No puedes hacer un delete de un objeto que no ha sido creado con new.

Código
  1. int main(int argc, char** argv) {
  2.  
  3.    Auto auto1;
  4.    Auto auto2("Chevrolet","ASDF",300);
  5.    Auto *auto3 = new Auto("Nissan","QWERT",500);
  6.  
  7.    // ...
  8.  
  9.    auto3 = &auto2;
  10.  
  11.    // ...
  12.    auto3 = &auto1;
  13.  
  14.    // ...
  15.  
  16.    delete auto3;
  17.  
  18.    return 0;
  19.  
  20. }

el delete está afectando al objeto auto1, ya que has modificado el puntero de auto3 para que apunte a la instancia de auto1. auto1 no ha sido creado con new y, por tanto, no se puede eliminar con delete.

Además, para no dejar lagunas de memoria, deberías poner el delete antes de la línea "auto3 = &auto2;"

Código
  1.    delete auto3;
  2.    auto3 = &auto2;

Una vez modificas el puntero "auto3" pierdes la referencia del objeto creado dinámicamente y, por tanto, desde ese momento es imposible eliminarlo y liberar esa parte de la memoria.


En línea

DarkSorcerer

Desconectado Desconectado

Mensajes: 69



Ver Perfil
Re: Ayuda con punteros (en C++)
« Respuesta #2 en: 17 Septiembre 2013, 09:18 am »

Gracias, se me olvidó ese detalle de que auto2 no fue creado por new y por eso no debo usar delete.



Ahora tengo otro problema, ahora me invente este problema, quise crear una clase que se llama Persona, sus atributos son el nombre, rut (en mi pais se refiere al numero de indentificacion) y la edad, tambie agregue un puntero que apunta a persona, con la intencion de que indicara a su hermano.

Yo me imagine esto, cuando creo a una persona, se le asigna una direccion en la memoria, a si que como soy imaginativo, dije "aaahh, voy a imaginar que la direccion de la memoria es la direccion de su casa", de esta manera, cree 2 personas de manera dinamica, pero el problema me sucede cuando quiero preguntar por los hermanos atraves de una funcion getHermano, me sale un error. Les dejo el error que me sale en la ventana de comandos y el codigo (Estoy usando Netbeans 7.3)

Código:
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory `/cygdrive/c/Documents and Settings/Administrador/Escritorio/C++/Repaso24'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/Cygwin_4.x-Windows/repaso24.exe
make[2]: Entering directory `/cygdrive/c/Documents and Settings/Administrador/Escritorio/C++/Repaso24'
mkdir -p build/Debug/Cygwin_4.x-Windows/_ext/931385711
rm -f build/Debug/Cygwin_4.x-Windows/_ext/931385711/Persona.o.d
g++    -c -g -MMD -MP -MF build/Debug/Cygwin_4.x-Windows/_ext/931385711/Persona.o.d -o build/Debug/Cygwin_4.x-Windows/_ext/931385711/Persona.o ../Repaso24/Persona.cpp
../Repaso24/Persona.cpp: In function ‘Persona Persona::* getHermano()’:
../Repaso24/Persona.cpp:54:12: error: ‘hermano’ was not declared in this scope
nbproject/Makefile-Debug.mk:67: recipe for target `build/Debug/Cygwin_4.x-Windows/_ext/931385711/Persona.o' failed
make[2]: *** [build/Debug/Cygwin_4.x-Windows/_ext/931385711/Persona.o] Error 1
make[2]: Leaving directory `/cygdrive/c/Documents and Settings/Administrador/Escritorio/C++/Repaso24'
nbproject/Makefile-Debug.mk:60: recipe for target `.build-conf' failed
make[1]: *** [.build-conf] Error 2
make[1]: Leaving directory `/cygdrive/c/Documents and Settings/Administrador/Escritorio/C++/Repaso24'
nbproject/Makefile-impl.mk:39: recipe for target `.build-impl' failed
make: *** [.build-impl] Error 2


BUILD FAILED (exit value 2,, total time: 9s)


Código
  1. #include "Persona.h"
  2. #include <string>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. Persona::Persona() {
  8. }
  9.  
  10. Persona::Persona(string n, string r, int e){
  11.  
  12.    nombre = n;
  13.    rut = r;
  14.    edad = e;
  15.    hermano = 0;
  16.  
  17. }
  18.  
  19. Persona::Persona(const Persona& orig) {
  20. }
  21.  
  22. Persona::~Persona() {
  23.  
  24.    cout <<"\n\nAniquilando a " << nombre;
  25.  
  26. }
  27.  
  28. string Persona::getNombre(){
  29.  
  30.    return nombre;
  31.  
  32. }
  33.  
  34. string Persona::getRut(){
  35.  
  36.    return rut;
  37.  
  38. }
  39.  
  40. int Persona::getEdad(){
  41.  
  42.    return edad;
  43.  
  44. }
  45.  
  46. void Persona::setHermano(Persona *h){
  47.  
  48.    hermano = h;
  49.  
  50. }
  51.  
  52. Persona Persona::*getHermano(){
  53.  
  54.    return hermano; // Me sale un triangulo con signode exclamacion (o admiracion)
  55.  
  56. }
  57.  
  58.  
  59.  
  60.  

Código
  1. #ifndef PERSONA_H
  2. #define PERSONA_H
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. class Persona {
  8. public:
  9.    Persona();
  10.    Persona(string n, string r, int e);
  11.    Persona(const Persona& orig);
  12.    virtual ~Persona();
  13.    string getNombre();
  14.    string getRut();
  15.    int getEdad();
  16.    void setHermano(Persona *h);
  17.    Persona *getHermano();
  18. private:
  19.    string nombre;
  20.    string rut;
  21.    int edad;
  22.    Persona *hermano;
  23. };
  24.  
  25. #endif /* PERSONA_H */
  26.  
  27.  

Código
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include "Persona.h"
  4.  
  5. using namespace std;
  6.  
  7. int main(int argc, char** argv) {
  8.  
  9.    Persona *persona1 = new Persona("Juan","123-K",25);
  10.    Persona *persona2 = new Persona("Pedro","456-L",23);
  11.  
  12.    cout <<"Los datos de la persona 1 son:\n";
  13.    cout <<"\nNombre: " << persona1->getNombre();
  14.    cout <<"\nRut: " << persona1->getRut();
  15.    cout <<"\nEdad: " << persona1->getEdad();
  16.    cout <<"\nLa direccion de su casa es: " << persona1;
  17.  
  18.    cout <<"\n\nLos datos de la persona 2 son:\n";
  19.    cout <<"\nNombre: " << persona2->getNombre();
  20.    cout <<"\nRut: " << persona2->getRut();
  21.    cout <<"\nEdad: " << persona2->getEdad();
  22.    cout <<"\nLa direccion de su casa es: " << persona2;
  23.  
  24.    //Relacionando las dos personas como hermanos
  25.  
  26.    persona1->setHermano(persona2);
  27.    persona2->setHermano(persona1);
  28.  
  29.    cout <<"\n\nEl hermano de la persona 1 se llama: "<< persona1->getHermano()->getNombre();
  30.    cout <<"\n\nEl hermano de la persona 2 se llama: "<< persona2->getHermano()->getNombre();
  31.  
  32.    delete persona1;
  33.    delete persona2;
  34.  
  35.    return 0;
  36. }
  37.  
  38.  
« Última modificación: 17 Septiembre 2013, 15:27 pm por Eternal Idol » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Ayuda con punteros (en C++) (Actualizacion constante con nuevas preguntas)
« Respuesta #3 en: 17 Septiembre 2013, 12:19 pm »

Código
  1. Persona Persona::*getHermano(){
  2.  
  3.    return hermano; // Me sale un triangulo con signode exclamacion (o admiracion)
  4.  
  5. }

Es así

Código
  1. Persona* Persona::getHermano(){
  2.  
  3.    return hermano;
  4.  
  5. }
En línea

DarkSorcerer

Desconectado Desconectado

Mensajes: 69



Ver Perfil
Re: Ayuda con punteros (en C++) (Actualizacion constante con nuevas preguntas)
« Respuesta #4 en: 18 Septiembre 2013, 06:05 am »

Gracias, he aprendido mucho preguntando en el foro elhacker, por eso gracias a los que me han ayudado.

Ahora, como habia dicho antes en este tema, me propuse ejercitar con listas enlazadas (estoy viendo estructura de datos en c++), en este caso, elegi usar "listas con doble nexo", algo asi

 NULL - O = O = O = O ....................... =O = O = O = O - NULL

El nodo anterior y siguiente de cada nodo lo represento como punteros, el codigo que hice me funciona ni me da problemas, pero, tengo una pregunta que tiene que ver mas con la optimizacion de la memoria.

Si bien, yo cree una lista de forma automatica (que deberia borrarse solo), ¿ que pasa con los nodos que siguiente y anterior creados de forma dinamica ?, ¿ Tendre que borrarlos uno por uno con delete ?, ¿existe algun modo de borrarlos de manera casi instantaneas ?

Les dejo mi codigo

Código
  1. #include "Nodo.h"
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. Nodo::Nodo(int n) {
  7.  
  8.    dato = n;
  9.    siguiente = 0;
  10.    anterior = 0;
  11.  
  12. }
  13.  
  14. Nodo::Nodo(const Nodo& orig) {
  15. }
  16.  
  17. Nodo::~Nodo() {
  18.  
  19.    cout <<"\nDestruyendo nodo ...\n";
  20.  
  21. }
  22.  
  23. void Nodo::setSiguiente(Nodo *s){
  24.  
  25.    siguiente = s;
  26.  
  27. }
  28.  
  29. void Nodo::setAnterior(Nodo *a){
  30.  
  31.    anterior = a;
  32.  
  33. }
  34.  
  35. int Nodo::getDato(){
  36.  
  37.    return dato;
  38. }
  39.  
  40. Nodo* Nodo::getSiguiente(){
  41.  
  42.    return siguiente;
  43.  
  44. }
  45.  
  46. Nodo* Nodo::getAnterior(){
  47.  
  48.    return anterior;
  49.  
  50. }
  51.  
  52.  
  53.  
  54.  
  55.  

Código
  1. #ifndef NODO_H
  2. #define NODO_H
  3.  
  4. using namespace std;
  5.  
  6. class Nodo {
  7. public:
  8.    Nodo(int n);
  9.    Nodo(const Nodo& orig);
  10.    virtual ~Nodo();
  11.    void setSiguiente(Nodo *s);
  12.    void setAnterior(Nodo *a);
  13.    int getDato();
  14.    Nodo* getSiguiente();
  15.    Nodo* getAnterior();
  16. private:
  17.    int dato;
  18.    Nodo *siguiente;
  19.    Nodo *anterior;
  20. };
  21.  
  22. #endif /* NODO_H */
  23.  
  24.  

Código
  1. #include "Lista.h"
  2. #include "Nodo.h"
  3. #include <iostream>
  4.  
  5. Lista::Lista() {
  6.  
  7.    head = NULL;
  8.    tail = NULL;
  9.  
  10. }
  11.  
  12. Lista::Lista(const Lista& orig) {
  13. }
  14.  
  15. Lista::~Lista() {
  16.  
  17.    cout <<"\nDestruyendo lista";
  18.  
  19. }
  20.  
  21. void Lista::setHead(int num){
  22.  
  23.    Nodo *nuevo = new Nodo(num);
  24.  
  25.    if(isEmpty()){
  26.  
  27.        head = nuevo; //La cabeza apunta a la direccion del nuevo nodo
  28.        tail = nuevo; //La cola tambien apunta a la direccion del nuevo nodo;
  29.  
  30.    }else{
  31.  
  32.        nuevo->setSiguiente(head); //Nuevo nodo apunta hacia adelante, a la direccion de la ex cabeza
  33.        head->setAnterior(nuevo); //La ex cabeza apunta hacia atras a la nueva cabeza
  34.        head = nuevo; //La cabeza es apuntada hacia el nuevo nodo;
  35.  
  36.    }
  37.  
  38. }
  39.  
  40. Nodo* Lista::getHead(){
  41.  
  42.    return head;
  43.  
  44. }
  45.  
  46. Nodo* Lista::getTail(){
  47.  
  48.    return tail;
  49.  
  50. }
  51.  
  52. bool Lista::isEmpty(){
  53.  
  54.    if(head == NULL){
  55.  
  56.        return true;
  57.  
  58.    }else{
  59.  
  60.        return false;
  61.  
  62.    }
  63. }
  64.  
  65.  

Código
  1. #ifndef LISTA_H
  2. #define LISTA_H
  3. #include "Nodo.h"
  4.  
  5. class Lista {
  6. public:
  7.    Lista();
  8.    Lista(const Lista& orig);
  9.    virtual ~Lista();
  10.    void setHead(int num);
  11.    Nodo* getHead();
  12.    Nodo* getTail();
  13.    bool isEmpty();
  14. private:
  15.    Nodo *head;
  16.    Nodo *tail;
  17. };
  18.  
  19. #endif /* LISTA_H */
  20.  
  21.  
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Ayuda con punteros (en C++) (Actualizacion constante con nuevas preguntas)
« Respuesta #5 en: 18 Septiembre 2013, 07:12 am »

Por cada new que pongas en tu código... tienes que poner otro delete. Lo que significa que la memoria no se va a liberar de forma automática y que cada nodo lo vas a tener que borrar tu de forma manual.

Puedes automatizar el proceso con un bucle... pero poco más.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[AYUDA] C# punteros
.NET (C#, VB.NET, ASP)
Miseryk 1 1,875 Último mensaje 28 Febrero 2014, 21:06 pm
por kub0x
Ayuda con Punteros en C.
Programación C/C++
camv123 3 1,749 Último mensaje 20 Abril 2014, 02:03 am
por camv123
Ayuda con Cstring y punteros
Programación C/C++
Zorzem 4 1,697 Último mensaje 25 Junio 2014, 11:39 am
por Eternal Idol
Ayuda con punteros en C « 1 2 »
Programación C/C++
snake_linux 12 4,592 Último mensaje 27 Agosto 2015, 15:50 pm
por kondrag_X1
[ayuda] punteros en linklist
Programación C/C++
bash 1 1,491 Último mensaje 15 Octubre 2016, 13:47 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines