Destructeur d'une classe vecteur

armasousou Messages postés 1268 Date d'inscription   Statut Membre Dernière intervention   -  
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,

je dois programmer une classe matrice, fille d'une classe vecteur (qui n'est rien d'autre qu'un tableau qui connais sa taille) pour manipuler des images.


J'ai un soucis avec les destructeurs, je comprend pas vraiment ce que je dois y faire ...

voici le bout de ma classe qui bloque :


____________Vecteur.hpp
class Vecteur
{

int taille;
double* value;

public:
Vecteur(int=1);
~Vecteur();
};

____________Vecteur.cpp

Vecteur::Vecteur(int n)
{
taille = n;
value= new double[n];
}

Vecteur::~Vecteur()
{
// bloquer ici !!!

delete[] value; // j'ai testé ca mais non ...
}



Merci d'avance

11 réponses

Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
ba c'est ça. Je ne voi pas ce que tu veux mettre de plus.
Un destructeur, a comme première et principale tâche de libérer la mémoire qui a été allouée dynamiquement.
--
La vrai soumission c'est quand les esclaves s'inquiètent du cours du coton.
Char Snipeur
0
armasousou Messages postés 1268 Date d'inscription   Statut Membre Dernière intervention   83
 
Justement, quand je met ca, je me tape un abandon core dans un main aussi simple que

#include "vecteur.hpp"

int main()
{
Vecteur v(4);
return 0;
}
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Je ne vois vraiment pas pourquoi. Essai de faire d'autres opération, le compilateur essai peut être trop d'optimiser.
0
armasousou Messages postés 1268 Date d'inscription   Statut Membre Dernière intervention   83
 
Non rien à faire, ya une erreur et elle viens de ce destructeur ...
0
armasousou Messages postés 1268 Date d'inscription   Statut Membre Dernière intervention   83
 
A tout hasard, mon destructeur est obligatoire ?? D'un coté, j'utilise un new pour le tableau, mais de l'autre, ya pas de new a proprement parlé pour le vecteur ...
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Pour moi, ce que tu as fais est juste.
Dans le doute, j'ai tout de même testé chez moi : aucun souci.
quel compilateur utilises tu ? N'y a t il aucun warning qui s'affiche ?
Donne nous ta ligne de compilation, l'erreur viens peut être de là.
Essai le debugueur.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
armasousou Messages postés 1268 Date d'inscription   Statut Membre Dernière intervention   83
 
J'ai pas de debugeur :x

Et j'utilise just g++ main.cpp vecteur.cpp -o mat

Je vais essayer avec les options -W -Wall
0
armasousou Messages postés 1268 Date d'inscription   Statut Membre Dernière intervention   83
 
Aucunes erreurs ...
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Bon...
essai de mettre
double * tab=new double[8];
tab[4]=0;
delete[] tab;
dans ton main (sans le delete du Vecteur) voir ce que ça donne.
Donne le résultat des commandes :
ldd mat
file mat

Tu n'a pas gdb d'installer ? As tu essayé ?

Si ça ne donne rien d'intéressant, j'aurai un dernier test.
0
armasousou Messages postés 1268 Date d'inscription   Statut Membre Dernière intervention   83
 
Non, je n'ai pas gdb, je ne connais pas :/ quand j'ai un bug sur un programme, je cherche et j'utilise -w -wall ^^

Aucun probleme quand je lance le programme (sachant que je ne declare aucun vecteur).

Voila les resultats :

mat: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xe71b974e074b1ce4944c7fa1c116e4e1e4f756b2, not stripped






linux-vdso.so.1 => (0x00007fff253ff000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f1e8aabb000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1e8a6fc000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1e8a3ff000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1e8add6000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f1e8a1e9000)
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Là je bloque vraiment... en plus il est bien lié à la stdc++.
Essai peut être le delete sans [], mais des cout un peu partout pour bien vérifier que le problème vient du "delete" et pas d'ailleurs.
0
armasousou Messages postés 1268 Date d'inscription   Statut Membre Dernière intervention   83
 
Mais en fait, le truc, c'est que j'avais pas de delete dans mon main, je crois que c'est a la fin du programme. aprés le return 0, le programme supprime tous les trucs statiques, dont le vecteur avec le destructeur que j'ai créé, nan ?
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
oui, c'est ça. Mais pourquoi fait il une erreur ???
ce que je te dit, c'est d'essayer de remplacer "delete[] value"
par "delete value".
0
armasousou Messages postés 1268 Date d'inscription   Statut Membre Dernière intervention   83
 
Ya plus d'erreur avec juste delete value, mais ca free bien ce qu'il faut ?

Et du coup, je comprend pas la différence entre delete et delete[]
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
normalement, delete[] est pour les tableaux (comme dans ton cas) et delete pour les pointeurs simples...
https://www.informit.com/
Je crois avoir déjà rencontrer un problème de ce type.
0
armasousou Messages postés 1268 Date d'inscription   Statut Membre Dernière intervention   83
 
Et j'ai une question, sans rapport avec ce delete, si tu peux m'aider et m'eviter de rouvrir un post ^^

ma classe matrice c'est :

class Matrice
{
int line;
Vecteur** tvect; // tableau de pointeur de vecteur
}

Donc mon constructeur c'est

Matrice::Matrice(int line, int col)
{
int i;

assert(line>0 && col>0);

this->line = line;

Vecteur** tvect = new Vecteur*[line];

for(i=0; i<line; i++)
tvect[i] = new Vecteur(col);
}

Et par conséquant, pour retourner un objet de type Vecteur à partir de Matrice, je renvoi *(tvect[i]); non ??
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
oui. Mais pourquoi utiliser un double pointeur ? un simple aurait suffit.
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
pourquoi te faire chier à passer par une fonction, écris directement :
tvect[i]->vectrand(n);
sans vectrand, difficile de dire.
0