2010-12-11 84 views
0

Si je passe en valeur en tant qu'argument à une fonction particulière, cette fonction libèrera-t-elle la mémoire de ce paramètre lorsque l'exécution de la fonction se terminera?Mécanisme d'allocation et de désallocation de mémoire en pile

Si je passe un pointeur ou une référence en tant qu'argument, que se passe-t-il si la fonction libère la mémoire de l'argument du pointeur? Cela affectera-t-il la variable en dehors de la fonction?

Répondre

0

Dans le premier cas, la mémoire sera "désallouée" (en fait, le pointeur de la pile sera augmenté). Si ce n'est pas le type POD, la variable destructor est appelée, ainsi la mémoire sera désallouée de tas si elle y a été allouée. Dans le second cas, la valeur référencée par le pointeur ne sera pas désallouée - seule la mémoire du pointeur sera désallouée.

0

Pour le point 1, cela dépend du type d'argument. Passage par ex. une 'chaîne' par valeur fera une copie implicite, et la mémoire utilisée par cette copie sera désallouée lorsque la variable (paramètre de fonction) sortira de la portée. Cela ne se produira pas automatiquement pour vos propres types - vous devrez configurer la construction et la destruction correctement. Pour la seconde - oui, désallouer en utilisant un pointeur affectera la mémoire qu'il adresse - à la fois à l'intérieur de la fonction et à l'extérieur.

Pour clarifier le deuxième point:

void func(char *someMemory) { 
    delete[] someMemory; 
} 

//... 
char *myArray = new char[100]; 
func(myArray); 

... supprimera la mémoire allouée - à l'aide myArray après l'appel à func est BAD.

+0

Il existe toujours un constructeur de copie implicite, même pour vos propres types. Si vous n'avez pas besoin d'une sémantique particulière, ils seront gérés automatiquement de la même manière que les "chaînes". –

+0

@Roberto: Je parle de types qui allouent de la mémoire. J'aurais dû dire "ne se produira pas nécessairement" automatiquement :) – sje397

0

Si vous passez une valeur ou un pointeur sur la pile la mémoire nécessaire pour maintenir cette valeur est allouée sur la pile ...

La façon dont la pile fonctionne, vous pouvez garder « allocation » plus de mémoire, mais il doit être "libéré" dans l'ordre inverse.

Alors:

void f(int *ptr, int v) 
{ 
// Do something 
} 

Lorsque vous appelez f() la valeur de ptr et v sont « poussés » sur la pile, qui est une mémoire suffisante est magique créée pour maintenir ces valeurs. Lorsque la fonction retourne la pile est ajustée dans l'autre sens, dans un sens, ils sont "sautés" de la pile.

Cette pression et ce déclenchement n'ont aucun effet sur le pointeur ou la valeur d'origine. Alors:

ptr++; 

Est-ce pas effet la valeur du pointeur détenu par la fonction appelante.

Si vous déréférencez, * ptr, le pointeur vous donne accès aux mêmes données visibles de l'extérieur de la fonction. Si vous libérez() le pointeur, cela affecte ce qui est vu de l'extérieur de la fonction. Ainsi, lorsque vous passez un pointeur, il n'y a aucune copie faite des données d'origine vers lesquelles le pointeur pointe, mais il y a une copie faite du pointeur réel. Le pointeur est passé par valeur.