Petit problème avec NEW DELETE et RETURN

Résolu
Signaler
Messages postés
22
Date d'inscription
jeudi 2 décembre 2004
Statut
Membre
Dernière intervention
15 novembre 2005
-
Messages postés
22
Date d'inscription
jeudi 2 décembre 2004
Statut
Membre
Dernière intervention
15 novembre 2005
-
Bonjour
j'ai un petit problème avec cette fonction. en c++ ou c :

#include <stdio.h>
#include <list>
#include <sys/types.h>
#include <dirent.h>
#include <string>
#include <cstring>

char * scan(char * chemin)
{

char * texte = new char;
char *temp;
temp = new char;
DIR *rep;
struct dirent *ep;
rep = opendir (chemin);
if (rep != NULL)
{
while (ep = readdir (rep))
{
temp=ep->d_name;
strcat(texte,"\r\n");
strcat(texte,temp);
}
closedir (rep);
}
return texte;
delete texte;
}

int main()
{etc...}

voila mon probleme :
la fonction renvoie un char *, donc une chaine de caratere.

I) Si j'appelle la fonction 1ere fois il me liste le dossier à l'adresse chemin (char *). ->ok

II) Si je la rapelle une deuxieme fois ->

1) sous dos -> quitte le programme.
2) sous un api windows ->

affiche 3 char bizarre et me liste mon dossier.

III)
sous win :3eme fois -> plantage.

Bon je sais que logiquement le RETURN arrete la fonction, donc le delete ne marche pas...

Bon si je le met avant c'est pas logique, il va rien me retourner.
le probleme ne vient peut etre pas du "char * texte=new char" mais d'autre chose.

Bon je sais que pour les allocations memoire et les char * ca fait 2 aussi, le mieux c'est les string.

Mais j'arrive pas a trouver la fonction qui permet de convertir en string mon "d_name" qui me renvoie un char [260].

Pouvez vous m'aider merci!!

7 réponses

Messages postés
78
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
26 avril 2005

Hum déjà retourner un pointeur, c'est pas génial
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Tu te mélange les pédales totales mon coco.
Déjà ce que tu dois savoir, c'est que les variables déclarées localement dans les fonctions n'ont pas besoin de delete, elles sont supprimées automatiquement dès la sortie de la fonction.

Ensuite, quand tu fais "char *texte = new char;" ca serait bien de spécifier la taille à allouer, car un char simple ne vaut que un seul octet!

Tu me diras que pourtant ton programme marche bien le premier coup!
Ceci est du au fait que texte soit un pointeur. Il indique donc l'adresse du premier élément que constotue ta chaine.

Autrement dis dans ton cas, il y a un dépassement de capacité qui ecrase les données présente sur les zone mémoires suivantes.

Pour terminer, il ne faut pas oublier qu'une fonction renvoyant un pointeur, renvoi une adresse mémoire et non un contenu.
Cela signifie qu'avec 2 appels succesifs de cette fonction, le premier résultat a de forte chance de se faire écraser par le deuxieme ou de se chevaucher.

En gros t'obtiens quelques choses d'illisible au final.

Commence par apprendre les bases de la programmation en C et par assimiler la notion de pointeur!
Si tu as besoin de conseil n'hésites pas!

Shell
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
char * texte = new char; // Tu aloue une zone de 1 octet, pas suffisant
il faut faire char* texte = new char[...];

la méthode c_str() te donnera un char* à partir d'un string.

Si tu fais une allocation dans ta fonction, ce n'est pas à elle de faire le delete, sinon tu ne pourras jamais utiliser le résultat. Mais ce delete il faut bien le faire à un moment donné...
En général on passe en paramètre une zone déja allouée avant l'appel (comme par exemple le premier param de strcpy), sinon tu risques d'avoir des fuites de mémoire. Il n'est pas logique de voir du code comme ca:

char* p =  scan(chemin);
delete[] p;


On fait plutot:

char* p =  new char[260];
scan(p, chemin);
delete[] p;


Par contre pas de problème pour une fonction qui renvoie un string
Messages postés
22
Date d'inscription
jeudi 2 décembre 2004
Statut
Membre
Dernière intervention
15 novembre 2005

:)
merci,

en fait j'ai remplace tous les char * par des string...
maintenant ca marche!!

C'est vrai que les char * c'est pas terrible...

mais bon un autre petit pobleme:

sous dos ca marche nikel

mais sous un api win32 là, j'ai ma fonction SetWindowsText(edit,texte) ou la texte est "un const char *"

et si je le converti il va creer un char* donc un pointeur que je vais rapeller... que faire?

peut etre qu'il existe une autre fonction pour afficher du texte dans un edit??
Messages postés
22
Date d'inscription
jeudi 2 décembre 2004
Statut
Membre
Dernière intervention
15 novembre 2005

probleme resolu avec c_str() :p:p:p

merci encore
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
"C'est vrai que les char * c'est pas terrible..."

C'est toi qui le dit ca!
Messages postés
22
Date d'inscription
jeudi 2 décembre 2004
Statut
Membre
Dernière intervention
15 novembre 2005

dsl :big) :-p c'est que je l'ai lu et que je le repeat betement :clown) *

bref j'ai un autre petit probleme plus ou moins lié alors je sais pas si faut que je refasse un post ou pas...

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
char * chemin=new char [3000];
chemin="d:\";
// ou alors
//string chemin;
//chemin ="d:\";
switch (message) /* handle the messages */
{

case WM_COMMAND :

switch(LOWORD(wParam))
{
case ID_LISTBOX :
{ if ((LOWORD(wParam) ID_LISTBOX) && (HIWORD(wParam) LBN_SELCHANGE))
{
ListBee(chemin);
break;
}
}
}
etc...

ma fonction ListBee qui est un peu longue...que j'ai racourci en truc inutile pour mon probleme.

void ListBee(char * chemin)
{
char * caption;
caption= new char[1024];
strcpy(caption, chemin);
strcat(caption,"\");
strcat(caption,"dossier");
delete[] chemin;
chemin=new char[3000];
strcpy(chemin, caption);
}

ou

void ListBee(string chemin)
{
char * caption;
caption= new char[1024];
strcpy(caption, chemin.c_str());
strcat(caption,"\");
strcat(caption,"dossier");
chemin.assign( caption);
}

voilà dans la procedure LRESULT CALLBACK WindowProcedure

je n'arrive pas a modifier mon "chemin"....

J'ai un doute sur le fait que la procedure en fait fait une boucle et me reassigne mon "chemin" que ce soit string ou char *

a cause de ma ListBox dans le switch...

en gros a chaque fois que j'utilise ListBee, le parametre devient "d:\" or je voudrais qu'il change.. est ce un probleme de pointeur ou est ce a cause de la procedure LRESULT CALLBACK WindowProcedure

Merci car vraiment je vois pas et si c pas a cause de la procedure ca m'eviterai de reprendre un gros bout de code