memoria - malloc sizeof c++
Ámbito de aplicación de malloc en una función. (6)
Cuando una función vuelve, ¿se libera la memoria asignada a través de malloc? ¿O aún se puede acceder a él en la función main () utilizando punteros?
p.ej.
void function(int *a)
{
a=(int *)malloc(sizeof(int));
*a=10;
}
int main()
{
int *num;
function(num);
printf("%d",*num);
return(0);
}
¿Se puede acceder al entero almacenado en a mediante main () aquí?
La memoria no se libera. Cualquier función puede asignar memoria y cualquier otra puede desasignarla. Es un verdadero desastre si no eres muy meticuloso, hasta que ... alguien inventó la recolección de basura.
No, la memoria asignada con malloc no se libera cuando deja el alcance / retorno de la función.
Eres responsable de liberar la memoria que malloc.
Sin embargo, en su caso, la memoria NO es accesible en main (), pero eso se debe a que solo se trata con una variable local.
void function(int *a)
{
a=(int *)malloc(sizeof(int));
Aquí, a
es una variable local dentro de la function
. Los punteros se pasan por valor en C, por lo que a
recibe una copia del puntero en main cuando realiza la function(num);
main () no ve que se asigna a esa copia local del puntero.
Tienes que hacer ya sea:
void function(int **a)
{
*a= malloc(sizeof(int));
**a=10;
}
int main()
{
int *num;
function(&num);
printf("%d",*num);
free(num);
return(0);
}
o
int* function(void)
{
int *a= malloc(sizeof(int));
*a=10;
return a;
}
int main()
{
int *num;
num = function();
printf("%d",*num);
free(num);
return(0);
}
No. Está pasando el puntero num
por valor, por lo tanto, los cambios realizados por la function
no se reflejarán en main
. Tan efectivamente no hay manera de acceder / liberar la memoria asignada desde la pantalla main
Para solucionar esto, puede pasar la dirección de num
o devolver a
función from y recopilar el valor devuelto en num
Puede almacenar la dirección directa de la memoria asignada en un contenedor de lista y luego crear una función para hacer un bucle, acceder a cada dirección en una función gratuita y luego sacar la dirección. Puede insertar la dirección directamente en la función free(myaddresslist.front()); myaddresslist.pop_front();
como free(myaddresslist.front()); myaddresslist.pop_front();
free(myaddresslist.front()); myaddresslist.pop_front();
. Esta es una forma casi de hacer su propia recolección de basura sin tener que cambiar todo el proyecto a idiomas basados en GC. Use myaddresslist.size()
para asegurarse de que no llama a free () en un campo vacío (lo que resulta en un bloqueo) y para determinar la cantidad de bucles que debe realizar.
malloc está funcionando bien (aunque tendrá que llamar a free () en el puntero que devuelve). El problema aquí es que no está devolviendo un puntero a la memoria que asignó.
"int * a", su parámetro a function () es la dirección de un entero. La forma habitual de devolver eso sería reescribir su función de la siguiente manera:
int * function()
{
int * a = (int *)malloc(sizeof(int));
*a = 10;
return a;
}
Para devolverlo a través de un parámetro, debe devolver la dirección del puntero:
// pp points to a pointer
void function( int ** pp )
{
// Assign allocated memory to the thing that pp points to
*pp = (int *)malloc( sizeof( int ) );
// Get the thing pp points to -- a pointer.
// Then get the thing which THAT pointer points to -- an integer
// Assign 10 to that integer.
**pp = 10;
}
void main()
{
int * p = NULL;
function( & p );
printf( "%d/n", *p );
free( p );
}
Y ahora sabes por qué inventaron C #.
Aquí hay una manera de reescribir su asignación para que quede más claro:
void function( int ** pp )
{
int * newmemory = (int *)malloc( sizeof( int ) );
// Assign 10 to the integer-sized piece of memory we just allocated.
*newmemory = 10;
// Assign allocated memory to the thing that pp points to.
*pp = newmemory;
}
malloc()
memoria malloc()
ed solo se libera cuando se llama free()
en ella. Se puede acceder a él con un puntero válido hasta ese momento.