Gratuit alloué de la mémoire avant le retour d'une fonction
Je suis en train de retourner un tableau à l'aide de malloc dans une fonction:
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;
}
Le problème est que j'ai besoin de gratuit parce que ma MCU de la taille de segment de mémoire est limitée. Mais je tiens à le retourner donc je ne peux pas libre dans la fonction, à droite?. Puis-je libérer la mémoire allouée à l'extérieur de la fonction (lorsque j'appelle la fonction). Est-il des pratiques exemplaires pour cela? Je vous remercie à l'avance!
Vous devrez la libérer à l'extérieur de la fonction. Il n'est pas nécessaire que malloc avais mémoire doit être libérée à l'intérieur de la fonction, de toute façon.
Bien sûr. C'est l'ensemble de point de
Bien sûr. C'est l'ensemble de point de
malloc
. Si vous ne pouvait pas le faire, il n'y aurait eu aucune raison pour malloc
à avoir jamais été créé.OriginalL'auteur KiL | 2012-08-01
Vous devez vous connecter pour publier un commentaire.
Que la mémoire allouée par malloc() est sur le tas et pas sur la pile, vous pouvez y accéder indépendamment de la fonction sont vous dans. Si vous souhaitez passer autour de malloc()'ed la mémoire, vous avez littéralement pas d'autre choix que de libérer de l'appelant. (dans le comptage de référence, c'est ce qu'on appelle un transfert de propriété.)
OriginalL'auteur
1) Oui, vous pouvez libérer de l'() la fonction malloc ed de la mémoire en dehors de la fonction
2) Non, vous ne pouvez pas libre à l'intérieur de la fonction et les données transmises à l'extérieur de la fonction, de sorte que vous devez faire 1) ici
3) Si vous êtes préoccupé par la rareté de la mémoire, vous devez vérifier l'échec d'allocations de mémoire toujours, qui vous omettez de le faire ici, qui est alors susceptible de conduire à une erreur de segmentation
oui, je ne inquiétude à propos de ce problème lorsque vous libérez un malloc avais de la mémoire en dehors de la fonction. Comment pouvez-vous résoudre ce problème?
la "solution" est de gérer le cas où votre allocation de mémoire routines sont pas en mesure d'allouer de la mémoire que vous voulez, et ne parviennent pas normalement, la place de ce que le thread de contrôle de l'exécution d'arriver b0rkened par un pointeur NULL.
OriginalL'auteur tbert
Bien sûr, vous pouvez libérer la mémoire allouée dans une fonction à l'extérieur de cette fonction à condition que vous le retourner.
Mais, une autre solution serait de modifier votre fonction comme ci-dessous, où l'appelant n'alloue & libère la mémoire. Ce sera en ligne avec le concept de la fonction qui alloue de la mémoire, qui prend la responsabilité de libérer la mémoire.
//En l'appelant
OriginalL'auteur Jay
Oui, vous pouvez libérer de la mémoire allouée en fonction de ce que vous appelez en dehors de la fonction; c'est précisément ce que vous devez faire dans ce cas.
Alternatives incluent le passage d'un tampon et sa longueur dans la fonction, et le retour de la longueur réelle de l'appelant, la façon
fgets
. Cela peut ne pas être la meilleure solution, parce que les appelants auraient besoin d'appeler votre fonction dans une boucle.OriginalL'auteur dasblinkenlight