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 :
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;
}
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++.

Merci!