2012-08-01 18 views
10

que estoy tratando de devolver una matriz usando malloc en una función:memoria asignada gratuito antes de vuelta una función

char* queueBulkDequeue(queueADT queue, unsigned int size) 
{ 
    unsigned int i; 
    char* pElements=(char*)malloc(size * sizeof(char)); 
    for (i=0; i<size; i++) 
    { 
     *(pElements+i) = queueDequeue(queue); 
    } 
    return pElements; 
} 

El problema es que necesito libre porque mi tamaño de la pila de MCU es limitada . Pero quiero devolverlo para que no pueda liberarlo en la función, ¿verdad ?. ¿Puedo liberar la memoria asignada fuera de la función (donde llamo a la función)? ¿Hay algunas mejores prácticas para esto? ¡Gracias de antemano!

+2

Deberá liberarlo fuera de la función. No es necesario que la memoria malloc'd se libere dentro de la función de todos modos. – futureelite7

+0

Por supuesto. Este es el punto completo de 'malloc'. Si no pudieras hacer esto, no habría habido ninguna razón para que 'malloc' alguna vez se haya creado. –

Respuesta

9

Como la memoria asignada por malloc() está en el montón y no en la pila, se puede acceder a él, independientemente de la función que se encuentre. Si Si desea pasar la memoria malloc(), literalmente no tiene otra opción que liberarla de la persona que llama. (en términos de recuento de referencia, eso es lo que se denomina transferencia de propiedad.)

4

Sí, puede liberar memoria asignada en una función que llama fuera de la función; esto es precisamente lo que necesita hacer en este caso.

Las alternativas incluyen pasar un búfer y su longitud en la función, y devolver la longitud real a la persona que llama, de la manera en que lo hace fgets. Puede que esta no sea la mejor alternativa, porque las personas que llaman necesitarán llamar a su función en un bucle.

+0

Downvoter, explique amablemente lo que piensa que está mal con esta respuesta. – dasblinkenlight

10

1) Sí, puede liberar() la memoria malloc'ed fuera de la función

2) No, no se puede liberarla dentro de la función y tienen los datos que se pasan fuera de la función, por lo que debe hacer 1) aquí

3) Si usted está preocupado acerca de la memoria escasa, es necesario comprobar por falta de asignaciones de memoria siempre, que usted no puede hacer aquí, que es entonces probable que conduzca a una violación de segmento

+1

"... a segfault" O peor, en un sistema integrado. –

+0

sí, me preocupa este problema cuando liberas una memoria malloc fuera de la función. ¿Cómo puedes arreglarlo? – KiL

+0

@KiL la "solución" es manejar el caso en el que las rutinas de asignación de memoria no pueden asignar la memoria que desea, y falla correctamente, en lugar de que el hilo de control que se está ejecutando se agrave con un puntero NULL. – tbert

7

Por supuesto, puede liberar la memoria asignada en una función fuera de esa función siempre que devuelva i t.

Pero, una alternativa sería modificar su función como a continuación, donde la persona que llama solo asigna & libera la memoria. Esto estará en línea con el concepto de la función que asigna la memoria se encarga de liberar la memoria.

void queueBulkDequeue(queueADT queue, char *pElements, unsigned int size) 
{  
    unsigned int i;  
    for (i=0; i<size; i++)  
    {   
     *(pElements+i) = queueDequeue(queue);  
    }  
    return; 
} 

// En la persona que llama

char *pElements = malloc(size * sizeof(char)); 
queueBulkDequeue(queue, pElements, size); 
//Use pElements 
free(pElements); 
Cuestiones relacionadas