C ++: Señal: SIGSEGV (fallo de segmentación), 深 拷贝

El problema Señal: SIGSEGV (Fallo de segmentación) ocurre cuando C ++ se está ejecutando, generalmente porque el sistema accede al espacio de memoria fuera del sistema asignado para este programa . Como resultado, se producen segfaults, que suelen ocurrir cuando se utilizan punteros.

P.ej

bounds_ =(int *)malloc(2 * sizeof(int))
bonuds_[0]= 0 ;
bonuns_[1]= 1 ;

base = bound;
cout<<base[0];   // 0 
free(bound);
cout<<base[0];   //Signal: SIGSEGV (Segmentation fault)

Porque en base = bound, el valor de la dirección temp apuntado en el límite se asigna a la base, y en free (obligado), el temo de memoria asignada dinámicamente se lanza, y luego la base se usa para acceder a la temperatura en este momento. Ocurrió una falla de segmentación porque se accedió a un espacio de memoria diferente al asignado por el programa.

La asignación directa entre los punteros base = enlazados anteriores es una copia superficial, y las dos variables de puntero apuntan al mismo espacio de memoria. La copia profunda es reasignar el espacio de memoria a la nueva variable de puntero al asignar.

El código anterior se puede cambiar a:

bounds_ =(int *)malloc(2 * sizeof(int));
bonuds_[0]= 0 ;
bonuns_[1]= 1 ;

base =(int *)malloc(2 * sizeof(int));
for (i =0 ; i< 2 ;i++){
   base[i]=bound_[i];
}

cout<<base[0];   // 0 
free(bound_);
cout<<base[0];   //0

La ventaja de la copia profunda es que los dos punteros no se afectan entre sí y los puntos copiados apuntan al contenido de la memoria en lugar del valor de la dirección en la variable del puntero.

El problema de la copia superficial se produce principalmente en la parte de la recuperación de memoria. C ++ generalmente no recupera la memoria asignada dinámicamente.

En C, malloc se usa para asignar memoria y free se usa para liberar memoria manualmente. C ++ usa new para asignar memoria y eliminar para liberar memoria manualmente.

En C ++, hay una biblioteca estándar llamada biblioteca Boost. Cuando   se usa boost :: shared_ptr  para administrar la nueva memoria, no es necesario convertirla manualmente. Utilizará automáticamente memoria inútil asignada dinámicamente. Por referencia contando la memoria asignada, si el contador de referencia de la memoria asignada llega a 0, es decir, cuando el programa no tiene variables que puedan apuntar a esta memoria, se liberará automáticamente. Para obtener una copia detallada de los punteros, consulte:

https://blog.csdn.net/superSmart_Dong/article/details/108178633

Supongo que te gusta

Origin blog.csdn.net/superSmart_Dong/article/details/108067987
Recomendado
Clasificación