2010-06-06 6 views
5

Este código lleva al puntero colgando. Mi conjetura es no.Puntero colgante

class Sample 
{ 
public: 
int *ptr; 
Sample(int i) 
{ 
ptr = new int(i); 
} 

~Sample() 
{ 
delete ptr; 
} 
void PrintVal() 
{ 
cout << "The value is " << *ptr; 
} 
}; 

void SomeFunc(Sample x) 
{ 
cout << "Say i am in someFunc " << endl; 
} 

int main() 
{ 
Sample s1 = 10; 
SomeFunc(s1); 
s1.PrintVal(); 
} 
+1

¿cuál es su definición de puntero colgante? –

Respuesta

8

Sí. El constructor de copias de la muestra recibe una llamada cuando pasa s1 a SomeFunc. El constructor de copia predeterminado hace una copia superficial, por lo que ptr se eliminará dos veces.

0

Sí, como dijo el usuario.

~Sample() { 
    delete ptr; // Pointer deleted but left dangling 
    ptr = NULL; // Pointer is no longer dangling 
} 

Nota sin embargo, que cualquier indicador que ha copiado a ese puntero quedará colgando a no ser que se establecen en NULL también.

0

Cuando pasa el objeto a SomeFunc() por valor, se realiza una copia superficial y después de su ejecución, el ptr de memoria que estaba apuntando ha sido eliminado ... cuando llama a la función PrintVal() en s1 y tratar de desreferenciar el puntero, su programa puede bloquearse en esta etapa ... puede eliminar un puntero una vez y su memoria queda fuera de su control

Cuestiones relacionadas