2017-09-26 2 views
-8

Je ne comprends pas pourquoi, lorsque nous supprimons un pointeur vers un autre objet le souffle PC vers le haut. Je ne comprends pas ce qui est arrivé exactement.pointeur après pointant vers un autre objet produit une erreur d'exécution

J'ai intentionnellement créé cette erreur afin de comprendre ce qui se passe.


Rule.h

#ifndef RULE_H 
#define RULE_H 

#include <iostream> 
#include <ostream> 

class Rule{ 

    friend std::ostream & operator<<(std::ostream & output, const Rule &); 
public: 
     Rule(); 
     ~Rule(); 
     //I remove copy constructo and assignment operator for clarity 
     void insert_num(const int &); 
private: 
    int _num; 
    int *_numbers; 
    int _used; 
}; 

#endif 

Rule.cpp

#include "Rule.h" 

#include <iostream> 
#include <ostream> 

Rule::Rule():_numbers(new int[100]),_used(0){} 

Rule::~Rule(){ 
    std::cout << "Destructor called " << std::endl; 
    delete [] _numbers; 
} 

void Rule::insert_num(const int & x){ 
    if(_used == 100){ 
     std::cout <<"cannot add more number " << std::endl; 
    } 
    else{ 
     _numbers[_used] = x; 
     _used += 1; 
    } 
} 

main.cpp

#include "Rule.h" 

#include <iostream> 

int main(){ 
    Rule rule1; 
    rule1.insert_num(1); 

    Rule *rule4 = new Rule(); 
    rule4->insert_num(9); 

    rule4 = &rule1; 

    delete rule4; 
} 

Erreur

00400000-00402000 r-xp 00000000 08h08 9.699.974
/home/hanidaher/espace de travail/Cplusplus/rule_of_three/out r 00601000-00602000 - p 08 00001000 : 08 9699974
/home/hanidaher/espace de travail/Cplusplus/rule_of_three/out rw-p 00602000-00603000 00002000 08h08 9.699.974
/home/hanidaher/espace de travail/Cplusplus/rule_of_three/out 019a6000-019d8 000 rw-p 00000000 00:00 0
[heap] 7efca4000000-7efca4021000 rw-p 00000000 00:00 0 7efca4021000-7efca8000000 --- p 00000000 00:00 0 7efca8305000-7efca840d000 r-xp 00000000 08:07 7865590
/lib/x86_64-linux-gnu/libm-2.23.so 7efca840d000-7efca860c000 --- p 00108000 08:07 7865590
/lib/x86_64-linux-gnu/libm-2.23.so 7efca860c000-7efca860d000 r- -p 00107000 08:07 7865590
/lib/x86_64-linux-gnu/libm-2.23.so 7efca860d000-7efca860e000 rw-p 00108000 08:07 7865590
/lib/x86_64-linux-gnu/libm-2.23 .donc 7efca860e000-7efca87ce000 r-xp 00000000 08:07 7865595
/lib/x86_64-linux-gnu/libc-2.23.so 7efca87ce000-7efca89ce000 --- p 001c0000 08:07 7865595
/lib/x86_64-linux-gnu/libc-2.23. si 7efca89ce000-7efca89d2000 r - p 001c0000 08:07 7865595
/lib/x86_64-linux-gnu/libc-2.23.so 7efca89d2000-7efca89d4000 rw-p 001c4000 08:07 7865595
/lib/x86_64 Linux -GNU/libc-2.23.so 7efca89d4000-7efca89d8000 rw-p 00000000 00:00 0 7efca89d8000-7efca89ee000 r-xp 00000000 08:07 7868899 /lib/x86_64-linux-gnu/libgcc_s.so.1 7efca89ee000-7efca8bed000 --- p 00016000 08:07 7868899
/lib/x86_64-linux-gnu/libgcc_s.so.1 7efca8bed000-7efca8bee000 rw-p 00015000 08:07 7868899
/lib/x86_64-linux-gnu/libgcc_s.so.1 7efca8bee000-7efca8d60000 r-xp 00000000 08:07 14951439
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 7efca8d60000-7efca8f60000 --- p 00172000 14951439 08:07
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 7efca8f60000-7efca8f6a000 r - p 00172000 14951439 08:07
/usr/lib/x86_64-linux-gnu/libstdC++. so.6.0.21 7efca8f6a000-7efca8f6c000 rw-p 0017c000 08:07 14951439
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 7efca8f6c000-7efca8f70000 rw-p 00000000 00:00 0 7efca8f70000-7efca8f96000 r-xp 00000000 08:07 7865561
/lib/x86_64-linux-gnu/ld-2.23.so 7efca916e000-7efca9173000 rw-p 00000000 00:00 0 7efca9192000-7efca9195000 rw-p 00000000 00:00 0 7efca9195000-7efca9196000 r - p 00025000 08:07 7865561
/lib/x86_64-linux-gnu/ld-2.23.so 7efca9196000-7efca9197000 rw-p 00026000 08:07 7865561
/lib/x86_64-linux- gnu/ld-2.23.so 7efca9197000-7efca9198000 rw-p 00000000 00:00 0 7fff8bacc000-7fff8baed000 rw-p 00000000 00:00 0
[pile] 7fff8bbe6000-7fff8bbe8000 r - p 00000000 00:00 0
[ Vvar] 7fff8bbe8000-7fff8bbea000 r-xp 00000000 00:00 0
[VDSO] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0
[vsyscall]

+9

Vous pouvez uniquement supprimer les éléments créés avec 'new'. Ici vous avez violé cette règle. Maintenant vous savez pourquoi vous ne devriez pas faire cela :-) –

+2

la moitié de votre problème est équivalent à 'int x; int * p = & x; delete p; ' – user463035818

+1

Pour expliquer le comportement que vous voyez, trouvez le code source dans le compilateur et déboguez la fonctionnalité' delete'. Pensez à un algorithme d'allocation de mémoire et à la suppression associée. Appelez maintenant cette fonction de suppression avec une variable locale qui ne faisait pas partie du pool de mémoire. –

Répondre

4

L'utilisation de delete sur une variable locale est un comportement indéfini. L'opérateur delete est destiné aux objets alloués dynamiquement qui ont été alloués à l'aide de new.

Le compilateur est autorisé à stocker des variables dans des registres et la suppression d'un registre n'a pas de sens.

Le compilateur peut placer la variable sur une pile et la suppression de la mémoire de pile n'a aucun sens.

Un comportement non défini n'a pas de comportement standard; tout peut arriver et ne vous attendez pas à ce que les utilisateurs de StackOverflow expliquent les résultats d'un comportement indéfini.