Bonjour,
J'ai cherché pas mal de temps sur différents forums mais je ne trouve pas de réponse à mon souci.
Dans une fonction main, je fais appel à une méthode membre d'une classe matrixCode:
1
2
3
4
5 int main (int argc, char** argv) { }
Version imprimable
Bonjour,
J'ai cherché pas mal de temps sur différents forums mais je ne trouve pas de réponse à mon souci.
Dans une fonction main, je fais appel à une méthode membre d'une classe matrixCode:
1
2
3
4
5 int main (int argc, char** argv) { }
erreur 37 ?:mrgreen:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 int main (int argc, char ** argv) { mesh meshPC; meshPC.computeFeature (); return 0; } void mesh::computeFeature () { double* ddd; ddd= new double[120]; delete [] ddd; } // plante
Et en fait, lorsque j'appel la fonction computeFeature depuis le main, à la fin de la fonction il plante et me dit que mon executable va etre arrété, mais quand j'enleve la désallocation du pointeur ddd, ça fonctionne et je ne comprend pas pourquoi je ne peux pas désallouer moi même le pointeru ?
Merci de vos réponses et désolé d'avoir coupé le sujet en deux (fausse manip)
Algernon
Le code que tu présentes est tout à fait correct et même préféré, il évite les fuites mémoires.
Si plantage il y a, ça vient sûrement d'autre part que ces 3 lignes.
Bonjour,
en fait je me suis apperçu que lorsque je lance mon executable plusieurs fois de suite, desfois ça plante, desfois ça va marché, je n'y comprends rien lol
Algernon
bnjour
J'ai aussi vu que si j'instancie un objet dans la fonction computeFeature et que à la fin je fais appel au destructeru moi même, ça va désallouer l'espace réservé pour l'objet, mais vu que à la fin de la fonction, les 3 destructeurs vont être automatiquement appelé, desfois il va accepté que j'ai déjà désallouer la mémoiore pour ces objets desfois non
Merci
Désolé,
Je crois savoir pourquoi ça plante, c'est que lorsque on déclare un objet dans un fonction comme sur le code ci-desous:
Je savais que à la fin de ma fonction les destructeur de la classe matrix serait appelé automatiquement, mais je pensais que le faie moi-même ca donnerai un code plus propre, mais ça fait planter une fois sur deux, d'où il ne faut jamais faire appel explicitement aux destructeurs.Code:
1
2
3
4
5 matrix m(3, 3); m.~matrix (); // NON A NE JAMAIS FAIRE (FERA PLANTER 1 FOIS SUR 2)
Merci
Algernon
Il y a deux raisons possibles :
- « new » peut échouer, chose que tu ne vérifies pas. Dans ce cas, une exception est lancée. Cela dit, c'est peu probable avec seulement 120 double ;
- Comme l'a dit Bousk, il est fort probable que ce soit dû à un effet de bord d'une procédure que tu exécutes entre les deux, et qui ne se révèle qu'au dernier moment. Le cas le plus courant et le plus classique est le dépassement de tableau. Dans le cas qui nous intéresse, tu ne peux écrire que de ddd[0] à ddd[119]. Si tu utilises toute autre valeur, tu écris en dehors de ton tableau et tu écrases ce qui ce trouve à côté, éventuellement les méta-données d'allocations de ton tableau. Donc, dès que tu essaies de le libérer : boum !
EDIT : On a posté en même temps.
Ah, non, effectivement, c'est à ne pas faire. D'abord, parce que le compilo ne peut pas le savoir, et va te laisser continuer à utiliser un objet que tu as détruit en milieu de ton bloc. Ensuite, parce que pour les mêmes raisons, le compilo va toujours détruire lui-même l'objet à la fin du bloc. Si tu l'as déjà fait avant, forcément, ça plante.
Bonjour et merci pour la réponse,
En fait j'ai simplifier ma fonction mais je vérifie à chaque fois que l'allocaion soit bonne avec les new, mais alors si ça proviendrait d'un débordement pourquoi si je lance la fonction plusieurs fois de suite avec le même jeu de paramètre, ça plante desfois si ça plant une fois ça devrait planter tout le temps
Algernon
et de toute façon, en fait je vais enlever l'appel aux destructeru de mes objets dans la fonction car de toute façon il seront appelé automatiquement.
Je pense qu'il en est de même pour le object vector de la stl que j'utilise.
Merci
Algernon
Merci bousk,
car moi en fait je faisais par exemple
Merci BouskCode:
1
2
3
4
5
6
7
8
9
10 // Instanciation d'objet de type vector et matrix vector<double> v(3); matrix m (3,3); // trucs avec v et m // je pense que ces sont ces deux dernières lignes qui faisaitent planté et en plus inutiles pour les raisons invoquées plus haut v.~vector<double>(); m.~matrix (); ///////////////////////////////
Algernon