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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 292
    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 292
    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 292
    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 292
    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++.

+ Répondre à la discussion
Cette discussion est résolue.

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