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

 

 


Tema destacado:


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [17] 18 19 20
161  Programación / Programación C/C++ / Re: Punteros fantasmas... (asi le puse yo).. en: 13 Febrero 2019, 04:28 am
No te entendi, cual es el valor que se pierde que había asignado antes?..

EDIT:

Ah!, te refieres a que no debí haber escrito :

Código
  1. int * punteroSuma = new int;

sino:

Código
  1. int * punteroSuma = sumar(a, b);

directamente, verdad?...

Es como que cuando solicité memoria al declarar punteroSuma, esa memoria la dejé botada y pasé el puntero al valor de retorno de Suma.. creo que a eso te refieres...

162  Programación / Programación C/C++ / Re: Punteros fantasmas... (asi le puse yo).. en: 12 Febrero 2019, 02:18 am
Perfecto, y esos dos últimos que mencionaste (unique_ptr y shared_ptr) serian punteros inteligentes no ?..
163  Programación / Programación C/C++ / Re: Punteros fantasmas... (asi le puse yo).. en: 11 Febrero 2019, 21:54 pm
entiendo, entiendo...

tengo que imaginar al delete como un interruptor que desactiva el espacio de memoria
y al new como que lo activa..  podría ser así la abstracción.

Gracias nuevamente!! : :o :)
164  Programación / Programación C/C++ / Re: Punteros fantasmas... (asi le puse yo).. en: 11 Febrero 2019, 18:59 pm
Gracias por las respuestas a ambos.. me ha quedado mucho mas claro ahora con lo ultimo que han dicho..

Una ultima duda:

Código
  1.  
  2. int * sumar(int a, int b){
  3.     int * psuma = new int;
  4.     *psuma = a + b;
  5.     return psuma;
  6.  
  7. }
  8.  
  9. int main (){
  10.     int a = 5;
  11.     int b = 10;
  12.  
  13.     int * psuma = new int;    //duda con el nombre psuma
  14.     psuma = sumar(a, b);
  15.  
  16.     delete psuma;                //aqui se elimina psuma, pero cual?, el declarado
  17.                                         //en main solamente o los dos?
  18.  
  19. }
  20.  
  21.  

Que pasa en el siguiente caso ?

Código
  1.  
  2. int * sumar(int a, int b){
  3.     int * psuma = new int;
  4.     *psuma = a + b;
  5.     return psuma;
  6.  
  7. }
  8.  
  9. int main (){
  10.     int a = 5;
  11.     int b = 10;
  12.  
  13.     int * punteroSuma = new int;    //modificado el nombre
  14.     punteroSuma = sumar(a, b);
  15.  
  16.     delete punteroSuma;      //aqui se elimina psuma, punteroSuma o ambos?
  17. }
  18.  
  19.  


Gracias!
165  Programación / Programación C/C++ / Re: Punteros fantasmas... (asi le puse yo).. en: 11 Febrero 2019, 16:03 pm
Loretz, el codigo que pusiste funciona, entonoces tengo un caos en la cabeza jaja...
Cuando retorna un valor puntero o un valor comun y silvestre no se pierde el valor retornado, entonoces qué pasa con la variable declarada dentro de la funcion?.. no se destruye?...

Lo digo porque, en el caso de retornar un int, supongo que pasaría una copia y no sería problema, pero cuando retornas un int * no estarías retornando una copia... estarias retornando un puntero a la declaracion hecha dentro de la funcion...

166  Programación / Programación C/C++ / Re: Punteros fantasmas... (asi le puse yo).. en: 11 Febrero 2019, 00:27 am
Entiendo.  Pero es lógico que un puntero al ser creado dentro de una función e intentar devolverlo no sirve de nada?.. eso pienso yo, el puntero queda vacío, sin valor.. y cuando se quiera usar como valor retornado no apuntará a ninguna parte...  es asi?
167  Programación / Programación C/C++ / Re: Llevo 1 año estudiando C++ aprox., y aún no hallo sentido a los punteros.. en: 11 Febrero 2019, 00:24 am
Gracias por las respuestas, tendré que enfocarme en qué y cuando usar punteros, lo que pasa es que en mi afán de querer usarlos, cometo errores, típicamente cuando aprendo algo nuevo, me dan ganas de usar ese algo a la fuerza, y no debería pensar asi..

saludos.
168  Programación / Programación C/C++ / Punteros fantasmas... (asi le puse yo).. en: 10 Febrero 2019, 22:43 pm
Hola!
Me he topado con el siguiente escenario:

Código
  1.  
  2. //En este fragmento al terminar la función, se destruye el contenido de suma y retorna null o vacío, y el puntero suma sigue existiendo en memoria....
  3. int RetornaUnaSuma(int a, int b){
  4.  
  5.     int * suma = new int;
  6.     *suma = a+b;
  7.     return *suma;
  8. }
  9.  
  10. //Aqui intento retornar un puntero creado dentro de la misma función...
  11. int * RetornaUnaSuma(int a, int b){
  12.  
  13.     int * suma = new int;
  14.     *suma = a+b;
  15.     return suma;
  16.  
  17.     //pero al terminar la función, se destruye el contenido y retorna una dirección de memoria sin contenido, el puntero sigue existiendo..
  18. }
  19.  
  20.  

Según yo es mala práctica declarar punteros que quieras retomar dentro de una función o un ámbito...  bueno aparte de mala practica no funciona el retorno...Es como lo pienso?...

Probablemente se pueda devolver punteros cuando éstos mismos ingresan como argumento...

La función sería:

Código
  1. //Segun yo esto debe funcionar...
  2. int * RetornaUnaSuma(int * pSuma, int a, int b){
  3.  
  4.     *pSuma = a+b;
  5.     return pSuma;
  6.  
  7. }
  8.  


Que opinan...
Saludos.
169  Programación / Programación C/C++ / Re: Llevo 1 año estudiando C++ aprox., y aún no hallo sentido a los punteros.. en: 10 Febrero 2019, 03:04 am
Saludos,

- La utilidad de los punteros está más enfoca al uso eficiente de la Memoria, lo que se dice Memoria Dinámica, ya has tocado los temas de Listas Enlazadas, Variables de tamaño variable en tiempo de ejecución, etc.

- Te recomiendo este libro, en su página 155 habla sobre el uso de los Punteros y muchos ejemplos donde demuestra el porqué de su uso:
https://openlibra.com/es/book/fundamentos-de-programacion-con-el-lenguaje-de-programacion-c-ed-2017

Capítulo 12

Memoria Dinámica. Punteros

Hasta ahora, todos los programas que se han visto en capítulos anteriores almacenan su estado
interno por medio de variables que son automáticamente gestionadas por el compilador. Las varia-
bles son creadas cuando el flujo de ejecución entra en el ámbito de su definición (se reserva espacio
en memoria y se crea el valor de su estado inicial), posteriormente se manipula el estado de la varia-
ble (accediendo o modificando su valor almacenado), y finalmente se destruye la variable cuando el
flujo de ejecución sale del ámbito donde fue declarada la variable (liberando los recursos asociados
a ella y la zona de memoria utilizada). A este tipo de variables gestionadas automáticamente por el
compilador se las suele denominar variables automáticas (también variables locales), y residen en
una zona de memoria gestionada automáticamente por el compilador, la pila de ejecución, donde
se alojan y desalojan las variables locales (automáticas) pertenecientes al ámbito de ejecución de
cada subprograma.

Así, el tiempo de vida de una determinada variable está condicionado por el ámbito de su decla-
ración. Además, el número de variables automáticas utilizadas en un determinado programa está
especificado explícitamente en el propio programa, y por lo tanto su capacidad de almacenamiento
está también especificada y predeterminada por lo especificado explícitamente en el programa.
Es decir, con la utilización única de variables automáticas, la capacidad de almacenamiento de
un determinado programa está predeterminada desde el momento de su programación (tiempo de
compilación), y no puede adaptarse a las necesidades reales de almacenamiento surgidas durante
la ejecución del programa (tiempo de ejecución). (1)

La gestión de memoria dinámica surge como un mecanismo para que el propio programa, du-
rante su ejecución (tiempo de ejecución), pueda solicitar (alojar) y liberar (desalojar) memoria
según las necesidades surgidas durante una determinada ejecución, dependiendo de las circuns-
tancias reales de cada momento de la ejecución del programa en un determinado entorno. Esta
ventaja adicional viene acompañada por un determinado coste asociado a la mayor complejidad
que requiere su gestión, ya que en el caso de las variables automáticas, es el propio compilador el
encargado de su gestión, sin embargo en el caso de las variables dinámicas es el propio programa-
dor el que debe, mediante código software, gestionar el tiempo de vida de cada variable dinámica,
cuando debe ser alojada y creada, como será utilizada, y finalmente cuando debe ser destruida
y desalojada. Adicionalmente, como parte de esta gestión de la memoria dinámica por el propio
programador, la memoria dinámica pasa a ser un recurso que debe gestionar el programador, y se
debe preocupar de su alojo y de su liberación, poniendo especial cuidado y énfasis en no perder
recursos (perder zonas de memoria sin liberar y sin capacidad de acceso).

1 En realidad esto no es completamente cierto, ya que en el caso de subprogramas recursivos, cada invocación
recursiva en tiempo de ejecución tiene la capacidad de alojar nuevas variables que serán posteriormente desalojadas
automáticamente cuando la llamada recursiva finaliza.

Gracias por tu respuesta!

Entonces los punteros están enfocados a ser utilizados en casos donde se requiera solicitar memoria dinámica, por ejemplo la dimensión personalizada de una matriz o arreglo.. verdad?..  y en que otros ámbitos se puede usar?
saludos!
170  Programación / Programación C/C++ / Re: Ejecutar comando en C++ sin system() en: 10 Febrero 2019, 00:47 am
Yo entiendo que queda feo, pero es práctico, a mi no me quedó mas remedio que recurrir a ncurses y al System...   es decir, como ultimo recurso, que mas da?... en el amor, la guerra y la programación todo se vale  ;D
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [17] 18 19 20
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines