IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Probleme stupide de delete


Sujet :

C++

  1. #1
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut Probleme stupide de delete
    Bonjour,

    Voila, j'ai probleme bizarre de delete.

    Après avoir déclarer dynamiquement un tableau de int :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int *tab = new int[N-1];
    et après l'utilisation, je le detruit (normal).
    et lors du delete, j'ai un HEAP CORRUPTION

    Pourtant, je pense avoir bien deleter mon tableau.....
    Quelqu'un pour m'aider ?
    Merci d'avance.
    F.

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    à première vue, le problème vient du code qu'il y a entre le new et le delete. A un moment tu dois certainement faire une operation qui invalide le pointeur tab.

    Tu peux peut-être aussi, tout simplement, déclarer ton tableau sur la pile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int tab[N+1]; // au lieu de int * tab = new int[N+1];
    L'avantage c'est qu'ainsi tu n'a pas besoin de faire de delete: le tableau sera automatiquement détruit à la sortie de la portée.

  3. #3
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    Citation Envoyé par r0d Voir le message
    Bonjour,

    à première vue, le problème vient du code qu'il y a entre le new et le delete. A un moment tu dois certainement faire une operation qui invalide le pointeur tab.

    Tu peux peut-être aussi, tout simplement, déclarer ton tableau sur la pile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int tab[N+1]; // au lieu de int * tab = new int[N+1];
    L'avantage c'est qu'ainsi tu n'a pas besoin de faire de delete: le tableau sera automatiquement détruit à la sortie de la portée.
    Merci pour la réponse
    Le probleme est que N n'est pas une constante !


    pour info :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    int main (int argc, char *argv[])
    {
    	int N;
     
    	int min, max;
     
    	if(argc == 2)
    	{
    		N = atoi(argv[1]);
     
    		if(N == 0)
    		{
    			exit(0);
    		}
    	}
    	else 
    	{
    		exit(0);
    	}
     
    	int *tab = new int[N-1];
     
    	for(int i = 0; i < N; i++)
    	{
    		tab[i] = i+2;
    	}
    	min = 2;
     
    	do{
     
    		for(int i = 0; i < N-1; i++)
    		{
    			if(tab[i] != min && tab[i]%min == 0) 
    			{
    				tab[i] = 0;
    			}
    		}
    		min = Get_min_int(tab, N, min);
    		max = Get_max_int(tab, N);
    	}while( (tab[min]*tab[min])< max);
     
    	for(int i = 0; i < N-1; i++)
    	{
    		if(tab[i] != 0)
    		{
    			printf("%i ", tab[i]);
    		}
    	}
     
     
     
    	delete []tab;
     
    	getchar();
     
    	return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    int Get_max_int(int* t, int N)
    {
    	for(int i = N-1; i > -1; i--)
    	{
    		if(t[i] != 0)
    		{
    			return t[i];
    		}
    	}
    }
     
    int Get_min_int(int* t, int N, int last)
    {
    	for(int i = last+1; i < N-2; i++)
    	{
    		if(t[i] != 0)
    		{
    			return i;
    		}
    	}
    }

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Flob91 Voir le message
    Le probleme est que N n'est pas une constante !
    Ok. Tu devrais donc utiliser un vector. Mais avant tout, tu dois comprendre ton erreur.
    Un indice: le problème se situe dans la première boucle for de ton main

  5. #5
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    Merci,

    Il faudrait que j'arrete de faire des modifications sans arret comme un con.

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    R0d a raison : utilises un peu plus la STL cela devrait simplifier ton code et éviter des erreurs.
    Tes fonctions ont des noms surprenants : Get_max_int et Get_min_int ne renvoient pas le min et le max comme on pourrait s'y attendre mais le premier élément non nul en partant de la gauche (ou de la droite). Et l'une renvoi l'indice et l'autre la valeur. Ca risque d'être source de confusion.
    std::find_if avec un iterator dans un cas et un reverse iterator dans l'autre serait préférable à ces deux fonctions, d'autant qu'on verrait mieux que dans un cas tu utilises l'itérateur et que dans l'autre sa valeur.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Par défaut
    Citation Envoyé par Flob91 Voir le message
    Le probleme est que N n'est pas une constante !
    Citation Envoyé par r0d Voir le message
    Ok. Tu devrais donc utiliser un vector. Mais avant tout, tu dois comprendre ton erreur.

    Je plussoie sur l'utilisation du vector, mais une petite remarque quand même: le C++ (par opposition au C) permet la déclaration sur le pile de tableaux dont la taille n'est pas connue à la compilation. Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int n = 10;
    ...
    Machin tab[n];
    est tout à fait valide.

  8. #8
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Non les VLA ne sont valides qu'en C99 pas en C++.

  9. #9
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Et c'est aussi valide sur gcc (ca fait partie des "plus" qu'il offre) même en C++ avec -Wall -Wextra, et je n'ai pas trouvé comment le desactiver ... si quelqu'un a une idée.

  10. #10
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    -pedantic .. (enfin ça désactive pas, mais ça te prévient que tu fais un truc porc)

  11. #11
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    R0d a raison : utilises un peu plus la STL cela devrait simplifier ton code et éviter des erreurs.
    Tes fonctions ont des noms surprenants : Get_max_int et Get_min_int ne renvoient pas le min et le max comme on pourrait s'y attendre mais le premier élément non nul en partant de la gauche (ou de la droite). Et l'une renvoi l'indice et l'autre la valeur. Ca risque d'être source de confusion.
    std::find_if avec un iterator dans un cas et un reverse iterator dans l'autre serait préférable à ces deux fonctions, d'autant qu'on verrait mieux que dans un cas tu utilises l'itérateur et que dans l'autre sa valeur.
    Ceci est le premier jet de la transcription d'un algorithme (du crible d'Ératosthène). Je comprends que ce code n'est pas idéal, mais comme je le dis, c'est un début.

    petite question, y aurait il une difference en terme de temps d'execution ?
    MErci

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    atoi = très mauvaise idée !
    stringstream ou boost::lexical_cast (ou alors la bonne fonction C)

  13. #13
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    atoi = très mauvaise idée !
    stringstream ou boost::lexical_cast (ou alors la bonne fonction C)
    pourquoi déconseilles-tu atoi?

  14. #14
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Aucune vérificabilité de la réussite de la fonction.

  15. #15
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    ok mais dans un code sensible niveau performance, atoi reste le plus rapide et de loin

  16. #16
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Aucune vérificabilité de la réussite de la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    On success, the function returns the converted integral number as an int value.
    If no valid conversion could be performed, a zero value is returned.
    If the correct value is out of the range of representable values, INT_MAX or INT_MIN is returned.
    ce qu'il y a sur le site cplusplus

  17. #17
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ca montre bien qu'on ne sait pas s'il y a eu conversion ou échec quand on obtient 0, INT_MAX ou INT_MIN.
    Si on veut de la performance, il y a des fonctions plus robustes dans la bibliothèque C (enfin, si on veut de la perf, on ne passe pas par du format texte ).

  18. #18
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Ca montre bien qu'on ne sait pas s'il y a eu conversion ou échec quand on obtient 0, INT_MAX ou INT_MIN.
    Si on veut de la performance, il y a des fonctions plus robustes dans la bibliothèque C (enfin, si on veut de la perf, on ne passe pas par du format texte ).
    quel genre de fonction ? sprintf/scanf? atoi reste plus performant

  19. #19
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810

  20. #20
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par guillaume07 Voir le message
    ok mais dans un code sensible niveau performance, atoi reste le plus rapide et de loin
    Non, y'a plus rapide en C++, cf spirit.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. probleme new et delete
    Par Krishna dans le forum C++
    Réponses: 9
    Dernier message: 29/05/2008, 18h49
  2. [MySQL] probleme de requête DELETE
    Par tibotibo69 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 13/03/2008, 09h46
  3. Probleme (stupide?) d'include
    Par lostchina dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/07/2007, 17h48
  4. [Sybase] probleme sur un delete.
    Par agougeon dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/08/2006, 11h46
  5. [ EJB ] [JBoss ] [ XDoclet ] probleme avec cascade-delete
    Par Houbbba dans le forum Wildfly/JBoss
    Réponses: 4
    Dernier message: 03/05/2006, 10h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo