Bonsoir,
Depuis quelques heures je me suis penché sur le C++ (avec G++) avec la norme ISO/IEC 14882:2011 donc je suis nouveau dans ce monde, après de longues années passés sur le C (avec GCC), bref, pas grands choses qui changent.
Je m’intéresse surtout à l'opérateur new (que je j'utilise en C#, PHP, Java..) qui simplifie mon travaille d'allocation / désallocation mémoire dynamique qui me causais beaucoup de problèmes de memory leaks, SIGSEGV en C auparavant par ce que ... je faisais de la m*** voilà c'était pas la joie on n'en parle plus SVP c'est du passé
Je précise que C++14 ne fonctionne pas sous G++. Et je compile / exécute sous FreeDos/DosBox en DPMI pour l'accès protégé 32bits
J'ai commencé mon premier code C++11 il y a seulement quelques minutes.
J'instancie MaClasse avec ce fameux opérateur new (qui doit aussi être un simple malloc) j'assigne mes valeurs, voilà tout est bon tout fonctionne, jusqu’à là OK.
--> Et là je rencontre de petites difficultés.
En effet, pour désinstancier ma classe, la vider de ma mémoire, j'utilise la fonction delete. Alors je sais pas comment elle fonctionne, mais j'ai l'impression qu'elle ne fait pas son boulo.
En C je vide/desalloc tous mes attributs jusqu'à remplir de '0' pour finir par un free via "un semblant d'un destructeur" fait maison. es-ce que delete fait pareil ?
Après ce fameux delete qui est censé désinstancier MaClasse, que je pensais qu'elle allait la vider de ma mémoire, détruire l'instance, et bien non, ma classe est toujours présente..... , je peux toujours accéder aux attributs, les modifier, les afficher sans avoir un SIGSEGV ou je ne sais quoi.. Bizarre ?
Pour être plus cohérent, après delete(), je m'attendais à une erreur du style "Impossible d’accéder à l'objet" ou bien "Objet on instancié"...
Es ce qu'il faut que je fasse pareil qu'en C ? Cet à dire vider les attributs manuellement, et faire mon propre opérateur delete maison qui free() le pointeur ? Ou existe t-il une fonction "spéciale" dans ce C++11 que j'ai pas fais attention ? Les pointeurs restent en mémoire ? Ou ai-je tout simplement fais une faute ?
Voici mon code :J'essaie de me trouver de bonnes raisons de passer du C au C++11 si c'est largement plus avantageux avant de prendre la décision de réécrire mes projets en C++.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 #include <stdio.h> #include <stdlib.h> class MaClasse { public: int toto; int titi; unsigned int * tata; MaClasse() { printf("Constructeur \n"); } ~MaClasse() { printf("\n---Desctructeur---\n"); } }; int main() { printf("Debut\n"); // Instance MaClasse * test = new MaClasse; // Assignation des valeurs test->tata = new unsigned int[20](); // Creation de 20 tableaux d'unsigned int test->toto = 123; test->titi = 789; // Assigner '1234' au nouveau pointeur test->tata for(int b = 0; b < 19; b++) test->tata[b] = 1234; // Afficher les valeurs printf(" Contenu tata:%u\n", (unsigned int) test->tata[9]); printf(" Contenu toto:%u\n", (unsigned int) test->toto); printf(" Contenu titi:%u\n", (unsigned int) test->titi); delete test; // deleter l'instance // Reafficher les valeurs qui ne doivent plus exister... printf("\n Contenu tata:%u\n", (unsigned int) test->tata[9]); printf(" Contenu toto:%u\n", (unsigned int) test->toto); printf(" Contenu titi:%u\n", (unsigned int) test->titi); // Re-assignation de valeurs qui ne doivent non plus exister... printf(" Assignation de valeurs ... \n"); test->tata[9] = 5678; test->toto = 2316; test->titi = 2803; // Re et reafficher les valeurs qui DOIVENT PAS S'AFFICHER! printf(" Contenu tata:%u\n", (unsigned int) test->tata[9]); printf(" Contenu toto:%u\n", (unsigned int) test->toto); printf(" Contenu titi:%u\n", (unsigned int) test->titi); printf("Fin\n"); return 0; }
Merci!
Partager