Char* dans un destructeur

Signaler
Messages postés
151
Date d'inscription
mardi 12 octobre 2004
Statut
Membre
Dernière intervention
15 avril 2009
-
Messages postés
151
Date d'inscription
mardi 12 octobre 2004
Statut
Membre
Dernière intervention
15 avril 2009
-
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

Messages postés
151
Date d'inscription
mardi 12 octobre 2004
Statut
Membre
Dernière intervention
15 avril 2009

vrmt desoler pour le formatage...
si je px faire kkchose pour sa, laisse moi le savoir.
je ne vois pas de tag
 null part...
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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
Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
2
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.
Messages postés
14982
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
2 mars 2021
94
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...
Messages postés
151
Date d'inscription
mardi 12 octobre 2004
Statut
Membre
Dernière intervention
15 avril 2009

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...
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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
Messages postés
151
Date d'inscription
mardi 12 octobre 2004
Statut
Membre
Dernière intervention
15 avril 2009

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!