2009-10-16 5 views
1

Est-ce que ce code provoquer une fuite de mémoire:effectue une copie du contenu d'un tableau à une autre cause d'une fuite de mémoire

int main(){ 

    int * a = new int[10]; 
    int * b = new int[10]; 
    for(int i = 0 ; i < 10; i++) 
    { 
     a[i] = 1; 
     b[i] = 1; 
    } 

    for(int i = 0 ; i < 10; i++) 
    { 
     a[i] = b[i]; //each a[i] is allocated 4 bytes on heap 
        //when we copy b[i] into a[i] do we loose 
        //the reference to a[i] (hence a leak), 
        //and replace that reference 
        //with a reference to a new value? 
    } 

    delete[] a; 
    delete[] b; 


} 

Répondre

15

Non, il n'y a pas de fuite là. Vous ne faites que copier des valeurs dans le tableau. Considérez les rangées comme deux rangées de casiers dans un vestiaire - vous ne faites que copier ce qui se trouve dans un casier et le placer dans un casier de l'autre rive; le casier lui-même reste où il est.

+4

+1, surtout pour commencer votre réponse avec la réponse ;-) –

5

[Selon la vérification] Non, il n'y a pas de fuite - vous ne faites que copier les valeurs, pas les pointeurs. Une expression comme a[i] signifie *(a + i); vous regardez (ou attribuez) la valeur à cet endroit de la mémoire, ne jouez pas avec la mémoire elle-même.

+0

oui désolé c'est ce que je voulais dire – ldog

3

a et b sont des pointeurs vers int. Les déclarations a = 1; et b = 1; sont mauvaises. Vous ne devez pas affecter de littéraux entiers aux pointeurs. Vouliez-vous dire a[i] = 1; et b[i] = 1;? En supposant que c'est ce que vous vouliez dire alors non, il n'y a pas de fuite de mémoire.

1

Ce n'est pas une fuite de mémoire, car vous avez toujours une référence à la mémoire allouée par tas à un. Quelle serait une fuite de mémoire, cependant, est de savoir si, quelque part avant votre effacements vous avez dit

a = b; 

Ensuite, vous avez rien pointage à la mémoire que vous avez alloué un, étant donné que a et b souligné la mémoire allouée pour b.

1

Il n'y a pas de fuite. Les pointeurs a et b pointent sur le premier élément des tableaux appropriés et vous ne modifiez pas les valeurs a et b. De plus, vous ne faites qu'affecter des valeurs aux éléments de ces tableaux et détruire le tableau à la fin, donc tout semble correct.