Char* dans un destructeur

pepsidrinker Messages postés 151 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 15 avril 2009 - 10 févr. 2009 à 15:25
pepsidrinker Messages postés 151 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 15 avril 2009 - 10 févr. 2009 à 17:01
Premierement, merci de lire ce post, et merci a tous ceux qui veulent maider.
Jai le probleme suivant:
Jassigne des char* avec 'new[]' dans le constructeur d'une classe, et je les free avec un 'delete[]' dans le destructeur.
le probleme, c'est que sa plante au destructeur, et que les pointeurs sont bel et bien initalizer, et le error-chjecking autour aussi.

Voici mon code:
------------------------
#include "Core.h"


class ClEmployee:public ClDBCoreObject
{

public:
ClEmployee(int pi_id,ClSQL* pi_sql);
ClEmployee();
~ClEmployee();
bool Refresh();
void FreeMembers();
void AllocateMembers();
char* firstName;
char* lastName;
char* email;
char* role;
char* telephone;
char* extension;
};

ClEmployee::~ClEmployee()
{
FreeMembers();
}


void ClEmployee::FreeMembers()
{
if(firstName!=NULL)
delete [] firstName;
if(lastName!=NULL)
delete [] lastName;
if(email!=NULL)
delete [] email;
if(role!=NULL)
delete [] role;
if(telephone!=NULL)
delete [] telephone;
if(extension!=NULL)
delete [] extension;
}

void ClEmployee::AllocateMembers()
{
firstName = new char[HALF_MAX_SQL_BUFFER_SIZE];
lastName = new char[HALF_MAX_SQL_BUFFER_SIZE];
email = new char[HALF_MAX_SQL_BUFFER_SIZE];
role = new char[HALF_MAX_SQL_BUFFER_SIZE];
telephone = new char[QUARTER_MAX_SQL_BUFFER_SIZE];
extension = new char[QUARTER_MAX_SQL_BUFFER_SIZE];

if (!firstName || !lastName || !email || !role || !telephone || !extension)
{
Log("Not enough memory to allocate for buffer(s)\n");
}
}


ClEmployee::ClEmployee()
{}

ClEmployee::ClEmployee(int pi_id,ClSQL* pi_sql)
{
if(pi_id <0)
return;
id = pi_id;
if(!pi_sql)
return;
sql = pi_sql;
firstName = NULL;
lastName = NULL;
email = NULL;
role = NULL;
telephone = NULL;
extension = NULL;
AllocateMembers();
Refresh();

}


bool ClEmployee::Refresh()
{
if (!firstName || !lastName || !email || !role || !telephone || !extension)
{
Log("Buffer(s) not initialized or not enough memory\n");
return false;
}

if(!sql->IsConnected())
{
Log("SQL connection not connected\n");
return false;
}
ASSOC_ARRAY buffer;
if(!sql->Query("select * from employees",&buffer))
{
Log("Internal SQL error\n");
return false;
}
for(int i=0;i < buffer.num_rows(); ++i)
{
strcpy( firstName,buffer[i]["firstName"]);
strcpy( lastName,buffer[i]["lastName"]);
strcpy( email,buffer[i]["email"]);
strcpy( role,buffer[i]["role"]);
strcpy( telephone,buffer[i]["telephone"]);
strcpy( extension,buffer[i]["extension"]);
}
}
----------------
Le programe compile bien, mais une fois executer et detruit, sa plante...
Le fichier main.cpp fait une simple declaration 'static' de la classe et lui passe les arguments.
Quand je met en commentaire 'FreeMembers()' du destructeur, la classe roule nickel.
Se pourrait-il que le destructeur detruise automatiquement les char* allocater dynamiquement?
Encore une fois merci.

7 réponses

pepsidrinker Messages postés 151 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 15 avril 2009
10 févr. 2009 à 15:26
vrmt desoler pour le formatage...
si je px faire kkchose pour sa, laisse moi le savoir.
je ne vois pas de tag
 null part...
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
10 févr. 2009 à 15:31
Salut
Oui effectivement là c'est illisible. Essaye de copier coller ton code depuis un autre éditeur de texte. (notepad par ex)
A+
____________________________________________________________________________
Mon site internet :  
http://ImAnalyse.free.fr
0
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
10 févr. 2009 à 15:37
Bon c'est pas très lisible mais ta classe parait correcte. Le problème vient peut-être du fait que tu invoques plusieurs fois la méthode FreeMember en amont.


Essayes déjà :
 
if(firstName!=NULL) { delete [] firstName; firstName = NULL; }

au moins ça ne plantera plus.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
10 févr. 2009 à 15:38
Hello,
Je vois ptet quelqque chose qui pourrait causer le problème: dans ton destructeur, après chaque delete, penses bien à mettre tes pointeurs à NULL

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0

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

Posez votre question
pepsidrinker Messages postés 151 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 15 avril 2009
10 févr. 2009 à 15:44
Jai changer le code pour ceci:
---
void ClEmployee::FreeMembers()
{
    if(firstName!=NULL)
    {
        delete [] firstName;
        firstName=NULL;
    }
    if(lastName!=NULL)
    {
        delete [] lastName;
        lastName=NULL;
    }
    if(email!=NULL)
    {
        delete [] email;
        email=NULL;
    }
    if(role!=NULL)
    {
        delete [] role;
        role=NULL;
    }
    if(telephone!=NULL)
    {
        delete [] telephone;
        telephone=NULL;
    }
    if(extension!=NULL)
    {
        delete [] extension;
        extension=NULL;
    }
}

malgee vont bon conseils, sa ne fonctionne tjrs pas...
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
10 févr. 2009 à 16:20
Le destructeur ne détruit pas les char allouer dynamiquement. Puisque c'est à la destruction de char* que ce produit le crash, cela signifie que ta variable est corrompue. Il faut que tu vérifies partout que tu ne sort pas de ton tableau.
A+

____________________________________________________________________________
Mon site internet :  
http://ImAnalyse.free.fr
0
pepsidrinker Messages postés 151 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 15 avril 2009
10 févr. 2009 à 17:01
Jai realizer que le probleme semble venir de deleter 'email' et 'role' dans le destructeur.
Je ne sais pas pourquoi, mais je vais continuer mon investigation...Je vous laisserai savoir le resultat si je trouve!
0
Rejoignez-nous