Para trabajar con estructuras de datos que involucran punteros es imprescindible conocer las diferencias entre memoria stack y heap. Algunas estructuras que utilizan punteros son las listas enlazadas, los grafos y los árboles.
Los vectores también ya que un vector en realidad a punta a la primera dirección de la. Partecita que la memoria te reservo para usarla
3 года назад
Eso es verdad en algunos lenguajes, pero no en todos. En algunos los vectores (arrays) usan aritmética de punteros para calcular dónde encontrar determinado elemento (por ejemplo, si cada elemento usa 2 bytes y queremos el tercer elemento, en la posición 0 está el primero y por ende en la posición 4 está el tercero).
muchisimas gracias por este curso estoy viendo golang y hablaban de eso y me harte de no entender esta parte y encontre este video casi no hay nada hablando de esto y me ilumino de como funciona y de una forma super entendible las imagenes me ayudaron muchisimo tambien entenderlo muchisimas gracias desde mexico.
Gran contenido! Tu canal es super interesante y profundiza en varios tópicos de C++ que son elementales para cualquier programador. Por favor seguí así!
Excelente video , una consulta las variables de una clase están en heap o stack ?, por ejemplo tenga la clase Persona que tenga 2 propiedades como edad y peso, Persona *persona = new Persona(); persona->edad=14; persona->peso=70; siendo edad y peso variables enteras no punteros, en otras palabras cualquier propiedad dentro de una clase no puntera usaría el heap?. Gracias de antemano
Hola. Es excelente tu explicación, pero tengo una duda ¿Las variables globales primitivas también se almacenan en la stack?
3 года назад+1
Excelente pregunta :) En realidad, depende del lenguaje y su implementación, pero en varios lenguajes como Java o C++ las variables de tipos primitivos siempre se almacenan en stack, mientras que los objetos pueden almacenarse en stack o en heap. Creo que puede ayudarte este video que hice sobre punteros, porque es un tema íntimamente relacionado a este: ruclips.net/video/s8T7cPnYrz0/видео.html
entonces convendria declarar e como una variable estatica y se ubique en el data segment para evitar que se elimine la variable e una vez que se vacie el stack y asi evitar el memory leak?
2 года назад
Dónde se ubicará cada variable depende del uso que se le dará, de qué tan grande puede ser esa variable, de si es necesario que crezca en tamaño, etc. Porque la stack tiene un espacio limitado y fijo al inicio del programa. Si, por ejemplo, tenemos un arreglo en C++ que podría ocupar tanto 3 bytes como 100MB, entonces será mejor que se ubique en la heap (por ejemplo, como vector). También, si lo que creamos son objetos (con la palabra new), entonces se crearán indefectiblemente en la heap, no podemos elegir. Muchas cosas se crean en la heap sin que nos demos cuenta y sin que podamos elegir cambiar eso (por ejemplo, una variable std::string o los elementos de un std::vector).
_Una pregunta ese stack viene asignado por el tipo de dato?_ ejemplo: *int = 4 bytes*
2 года назад
Siempre depende del lenguaje y del compilador que se use, ya que no todos los lenguajes tienen stack y heap, y no todos lo usan de la misma forma. Si hablamos de C++, las variables que se declaran con un identificador van a estar en la stack y las que son creadas con el operador new van a estar en la heap. Por ejemplo, si declaro: int mi_variable = 100; esta variable estará en stack. Incluso si declaro un puntero de esta forma: int* mi_puntero = new int(500); la variable mi_puntero estará en stack mientras que el espacio de memoria apuntado (guardando el valor 500) estará en heap. Tal vez te sea útil mi video sobre punteros en C++ para entender mejor la diferencia entre stack y heap: ruclips.net/video/s8T7cPnYrz0/видео.html
@ oie y entonces new int(500) ese valor no tiene un identificador(nombre) en heap por lo que solo se puede acceder a ese valor mediante el puntero y si el puntero está en el stack al liberarse la memory stack ocurre un memory leak creo y por lo que dices del lenguaje tiene sentido ya que cada uno tiene su documentacion especifica, por ejemplo yo estoy ahorita en basic y el limite de frames en stack es de 5800 y tengo una ultima pregunta: los stackoverflow solo ocurren con los procedimientos recursivos o al utilizar loops tambien podrian ocurrir? saludos ✌
2 года назад
@@Sigmasapiens_oficial Exacto, si ejecutas la operación new int(500); estás generando una variable en memoria heap que no tiene un identificador. La única manera de acceder a esa variable sería a través de un puntero (este puntero puede estar en stack o en heap, pero el valor 500 definitivamente estará en heap). En este ejemplo, al ejecutar new int(500); solo almacenamos un valor en heap y no le dijimos en qué puntero guardar la dirección, por lo que ese valor quedará inaccesible, sin un puntero para que podamos llegar a él (el puntero podría estar en stack o en heap, pero definitivamente necesitaríamos un puntero para acceder). Si se deja un valor almacenado en la heap pero sin ningún puntero apuntándolo, entonces se produce un memory leak porque el espacio de memoria se mantendrá ocupado pero no podremos acceder. Respecto al stack overflow, se produce cuando se llena todo el espacio disponible en memoria stack. La recursividad es un caso práctico muy común en que sucede esto, pero no necesariamente el único. Podría ser algo tan simple como crear un arreglo muy grande que no quepa en el espacio designado para la stack. Espero haber respondido tus preguntas ☺.
3:23 Leía hace unos días en StackOverflow que a menos que se esté programando «sofware» de base/sistema como controladores, sistemas operativos, «firmware», BIOS, entre otros; automáticamente esa memoria es liberada. Los programadores explicaban que liberar la memoria era una especie de cortesía, y en este sentido, yo lo interpreto y comparo un poco con el hecho de colocar «return 0» al finalizar un programa en C, C++.
lo de return 0 en main, es porque, sin eso, literalmente "int main()" no funciona. Ya que una funcion que no sea void siempre tiene que retornar un valor. No es tanto lo mismo.
@@rnbois6346 «return 0» es el valor que devuelve la función principal al programa que gestiona los recursos del sistema operativo, una vez que esta ha finalizado. Mencionas que sin esta instrucción la función «main» no podría ejecutarse, pero los compiladores toman esta ausencia de «return 0» como una advertencia, más que como un error. Al fin de cuentas, la función «main» es el principio y el fin de cualquier programa en C y C++, por lo que finalizar la última instrucción bastará para saber que el programa ha terminado. No obstante, lo correcto sería indicarlo al devolver cero, creería yo.
Para trabajar con estructuras de datos que involucran punteros es imprescindible conocer las diferencias entre memoria stack y heap. Algunas estructuras que utilizan punteros son las listas enlazadas, los grafos y los árboles.
Los vectores también ya que un vector en realidad a punta a la primera dirección de la. Partecita que la memoria te reservo para usarla
Eso es verdad en algunos lenguajes, pero no en todos. En algunos los vectores (arrays) usan aritmética de punteros para calcular dónde encontrar determinado elemento (por ejemplo, si cada elemento usa 2 bytes y queremos el tercer elemento, en la posición 0 está el primero y por ende en la posición 4 está el tercero).
Ayer, por casualidad, encontré tu canal. Recién comienzo en el mundo de la programación y tus videos parecen muy interesantes. Gracias por compartir!
Ahora si entendí, por fin!!!!!
muchisimas gracias por este curso estoy viendo golang y hablaban de eso y me harte de no entender esta parte y encontre este video casi no hay nada hablando de esto y me ilumino de como funciona y de una forma super entendible las imagenes me ayudaron muchisimo tambien entenderlo muchisimas gracias desde mexico.
Hace mucho no programó en C pero recuerdo el tema heap y stack lo aprendí mucho más complejo.
Super bien explicado 😁😁😁 mil gracias
Una explicación muy clara y bien fundamentada. Muchas gracias
gracias por la paciencia en la explicación :)
Esta es la mejor explicación sobre el tema. 👌
Gran contenido!
Tu canal es super interesante y profundiza en varios tópicos de C++ que son elementales para cualquier programador.
Por favor seguí así!
Fantástica explicacion! Gracias!
gracias cñora por su conocimiento
Super bien explicado, muy bueno el vídeo.
Fantástico, muy claro todo!
increible el video, super util.
Te quiero muchísimo.
Muy buena explicación, gracias.
¡MUCHÍSIMAS GRACIAS!
Excelente video , una consulta las variables de una clase están en heap o stack ?, por ejemplo tenga la clase Persona que tenga 2 propiedades como edad y peso, Persona *persona = new Persona(); persona->edad=14; persona->peso=70; siendo edad y peso variables enteras no punteros, en otras palabras cualquier propiedad dentro de una clase no puntera usaría el heap?. Gracias de antemano
Excelente explicación! Me suscribo!
Gracias!
Excelente gracias
Muchas gracias
muy bueno!!!
Hola. Es excelente tu explicación, pero tengo una duda ¿Las variables globales primitivas también se almacenan en la stack?
Excelente pregunta :)
En realidad, depende del lenguaje y su implementación, pero en varios lenguajes como Java o C++ las variables de tipos primitivos siempre se almacenan en stack, mientras que los objetos pueden almacenarse en stack o en heap. Creo que puede ayudarte este video que hice sobre punteros, porque es un tema íntimamente relacionado a este: ruclips.net/video/s8T7cPnYrz0/видео.html
entonces convendria declarar e como una variable estatica y se ubique en el data segment para evitar que se elimine la variable e una vez que se vacie el stack y asi evitar el memory leak?
Dónde se ubicará cada variable depende del uso que se le dará, de qué tan grande puede ser esa variable, de si es necesario que crezca en tamaño, etc. Porque la stack tiene un espacio limitado y fijo al inicio del programa. Si, por ejemplo, tenemos un arreglo en C++ que podría ocupar tanto 3 bytes como 100MB, entonces será mejor que se ubique en la heap (por ejemplo, como vector). También, si lo que creamos son objetos (con la palabra new), entonces se crearán indefectiblemente en la heap, no podemos elegir. Muchas cosas se crean en la heap sin que nos demos cuenta y sin que podamos elegir cambiar eso (por ejemplo, una variable std::string o los elementos de un std::vector).
buenisimo! muchas gracias!
_Una pregunta ese stack viene asignado por el tipo de dato?_
ejemplo:
*int = 4 bytes*
Siempre depende del lenguaje y del compilador que se use, ya que no todos los lenguajes tienen stack y heap, y no todos lo usan de la misma forma. Si hablamos de C++, las variables que se declaran con un identificador van a estar en la stack y las que son creadas con el operador new van a estar en la heap. Por ejemplo, si declaro:
int mi_variable = 100;
esta variable estará en stack. Incluso si declaro un puntero de esta forma:
int* mi_puntero = new int(500);
la variable mi_puntero estará en stack mientras que el espacio de memoria apuntado (guardando el valor 500) estará en heap.
Tal vez te sea útil mi video sobre punteros en C++ para entender mejor la diferencia entre stack y heap: ruclips.net/video/s8T7cPnYrz0/видео.html
@ oie y entonces new int(500) ese valor no tiene un identificador(nombre) en heap por lo que solo se puede acceder a ese valor mediante el puntero y si el puntero está en el stack al liberarse la memory stack ocurre un memory leak creo
y por lo que dices del lenguaje tiene sentido ya que cada uno tiene su documentacion especifica, por ejemplo yo estoy ahorita en basic y el limite de frames en stack es de 5800
y tengo una ultima pregunta:
los stackoverflow solo ocurren con los procedimientos recursivos o al utilizar loops tambien podrian ocurrir?
saludos ✌
@@Sigmasapiens_oficial Exacto, si ejecutas la operación new int(500); estás generando una variable en memoria heap que no tiene un identificador. La única manera de acceder a esa variable sería a través de un puntero (este puntero puede estar en stack o en heap, pero el valor 500 definitivamente estará en heap). En este ejemplo, al ejecutar new int(500); solo almacenamos un valor en heap y no le dijimos en qué puntero guardar la dirección, por lo que ese valor quedará inaccesible, sin un puntero para que podamos llegar a él (el puntero podría estar en stack o en heap, pero definitivamente necesitaríamos un puntero para acceder). Si se deja un valor almacenado en la heap pero sin ningún puntero apuntándolo, entonces se produce un memory leak porque el espacio de memoria se mantendrá ocupado pero no podremos acceder.
Respecto al stack overflow, se produce cuando se llena todo el espacio disponible en memoria stack. La recursividad es un caso práctico muy común en que sucede esto, pero no necesariamente el único. Podría ser algo tan simple como crear un arreglo muy grande que no quepa en el espacio designado para la stack.
Espero haber respondido tus preguntas ☺.
3:23 Leía hace unos días en StackOverflow que a menos que se esté programando «sofware» de base/sistema como controladores, sistemas operativos, «firmware», BIOS, entre otros; automáticamente esa memoria es liberada. Los programadores explicaban que liberar la memoria era una especie de cortesía, y en este sentido, yo lo interpreto y comparo un poco con el hecho de colocar «return 0» al finalizar un programa en C, C++.
lo de return 0 en main, es porque, sin eso, literalmente "int main()" no funciona. Ya que una funcion que no sea void siempre tiene que retornar un valor. No es tanto lo mismo.
@@rnbois6346 «return 0» es el valor que devuelve la función principal al programa que gestiona los recursos del sistema operativo, una vez que esta ha finalizado. Mencionas que sin esta instrucción la función «main» no podría ejecutarse, pero los compiladores toman esta ausencia de «return 0» como una advertencia, más que como un error. Al fin de cuentas, la función «main» es el principio y el fin de cualquier programa en C y C++, por lo que finalizar la última instrucción bastará para saber que el programa ha terminado. No obstante, lo correcto sería indicarlo al devolver cero, creería yo.