C ++: Signal: SIGSEGV (erreur de segmentation), 深 拷贝

Le problème Signal: SIGSEGV (erreur de segmentation) se produit lorsque C ++ s'exécute, généralement parce que le système accède à l' espace mémoire en dehors du système alloué pour ce programme . En conséquence, des erreurs de segmentation se produisent, ce qui se produit souvent lors de l'utilisation de pointeurs.

Par exemple

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)

Dans la mesure où dans base = bound, la valeur d'adresse temp pointée dans bound est affectée à base, et dans free (bound), le temo de mémoire alloué dynamiquement est converti, puis base est utilisé pour accéder à temp à ce moment. Une erreur de segmentation s'est produite car un espace mémoire autre que celui alloué par le programme a été accédé.

L'affectation directe entre les pointeurs base = bound ci-dessus est une copie superficielle et les deux variables de pointeur pointent vers le même espace mémoire. La copie complète consiste à réallouer l'espace mémoire à la nouvelle variable de pointeur lors de l'affectation.

Le code ci-dessus peut être changé en:

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

L'avantage de la copie profonde est que les deux pointeurs ne s'affectent pas et que les points copiés pointent vers le contenu de la mémoire au lieu de la valeur d'adresse dans la variable de pointeur.

Le problème de copie superficielle se produit principalement dans la partie de la récupération de mémoire. C ++ ne récupère généralement pas la mémoire allouée dynamiquement.

En C, malloc est utilisé pour allouer de la mémoire et free est utilisé pour libérer manuellement de la mémoire. C ++ utilise new pour allouer de la mémoire et supprimer pour libérer manuellement la mémoire.

En C ++, il existe une bibliothèque standard appelée bibliothèque Boost. Lorsque   boost :: shared_ptr est  utilisé pour gérer la nouvelle mémoire, elle n'a pas besoin d'être castée manuellement. Elle utilisera automatiquement de la mémoire allouée dynamiquement inutile. En comptant la mémoire allouée, si le nombre de références mémoire allouées atteint 0, c'est-à-dire lorsque le programme n'a pas de variables pouvant pointer vers cette mémoire, il sera automatiquement libéré. Pour une copie complète des pointeurs, veuillez vous référer à:

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

Je suppose que tu aimes

Origine blog.csdn.net/superSmart_Dong/article/details/108067987
conseillé
Classement