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 :

Problème libération mémoire (opérateur delete)


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 64
    Points : 43
    Points
    43
    Par défaut Problème libération mémoire (opérateur delete)
    Bonjour,

    Je souhaite libérer la mémoire allouée précédement avec l'opérateur new.
    À la compilation tout fonctionne correctement, mais lorsque j'execute le binaire la mémoire ne semble pas se libérer correctement.
    Voici le output :
    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
     
    *** glibc detected *** ./realloc3: free(): invalid next size (fast): 0x0000000000bf2010 ***
    ======= Backtrace: =========
    /lib/libc.so.6[0x7f9a073dc808]
    /lib/libc.so.6(cfree+0x6c)[0x7f9a073e124c]
    ./realloc3(__gxx_personality_v0+0x22e)[0x400a46]
    /lib/libc.so.6(__libc_start_main+0xe6)[0x7f9a07387a26]
    ./realloc3(__gxx_personality_v0+0x41)[0x400859]
    ======= Memory map: ========
    00400000-00401000 r-xp 00000000 08:06 6864970                            /home/azmodai/devel/bricoles/cpp/alloc_mem/realloc3
    00600000-00601000 r--p 00000000 08:06 6864970                            /home/azmodai/devel/bricoles/cpp/alloc_mem/realloc3
    00601000-00602000 rw-p 00001000 08:06 6864970                            /home/azmodai/devel/bricoles/cpp/alloc_mem/realloc3
    00bf2000-00c13000 rw-p 00bf2000 00:00 0                                  [heap]
    7f9a00000000-7f9a00021000 rw-p 7f9a00000000 00:00 0 
    7f9a00021000-7f9a04000000 ---p 7f9a00021000 00:00 0 
    7f9a07369000-7f9a074b8000 r-xp 00000000 08:01 1113142                    /lib64/libc-2.10.1.so
    7f9a074b8000-7f9a076b8000 ---p 0014f000 08:01 1113142                    /lib64/libc-2.10.1.so
    7f9a076b8000-7f9a076bc000 r--p 0014f000 08:01 1113142                    /lib64/libc-2.10.1.so
    7f9a076bc000-7f9a076bd000 rw-p 00153000 08:01 1113142                    /lib64/libc-2.10.1.so
    7f9a076bd000-7f9a076c2000 rw-p 7f9a076bd000 00:00 0 
    7f9a076c2000-7f9a076d7000 r-xp 00000000 08:01 984301                     /lib64/libgcc_s.so.1
    7f9a076d7000-7f9a078d6000 ---p 00015000 08:01 984301                     /lib64/libgcc_s.so.1
    7f9a078d6000-7f9a078d7000 r--p 00014000 08:01 984301                     /lib64/libgcc_s.so.1
    7f9a078d7000-7f9a078d8000 rw-p 00015000 08:01 984301                     /lib64/libgcc_s.so.1
    7f9a078d8000-7f9a0795a000 r-xp 00000000 08:01 1113143                    /lib64/libm-2.10.1.so
    7f9a0795a000-7f9a07b59000 ---p 00082000 08:01 1113143                    /lib64/libm-2.10.1.so
    7f9a07b59000-7f9a07b5a000 r--p 00081000 08:01 1113143                    /lib64/libm-2.10.1.so
    7f9a07b5a000-7f9a07b5b000 rw-p 00082000 08:01 1113143                    /lib64/libm-2.10.1.so
    7f9a07b5b000-7f9a07c4a000 r-xp 00000000 08:01 241798                     /usr/lib64/gcc/x86_64-pc-linux-gnu/4.3.4/libstdc++.so.6.0.10
    7f9a07c4a000-7f9a07e4a000 ---p 000ef000 08:01 241798                     /usr/lib64/gcc/x86_64-pc-linux-gnu/4.3.4/libstdc++.so.6.0.10
    7f9a07e4a000-7f9a07e51000 r--p 000ef000 08:01 241798                     /usr/lib64/gcc/x86_64-pc-linux-gnu/4.3.4/libstdc++.so.6.0.10
    7f9a07e51000-7f9a07e53000 rw-p 000f6000 08:01 241798                     /usr/lib64/gcc/x86_64-pc-linux-gnu/4.3.4/libstdc++.so.6.0.10
    7f9a07e53000-7f9a07e66000 rw-p 7f9a07e53000 00:00 0 
    7f9a07e66000-7f9a07e83000 r-xp 00000000 08:01 1113151                    /lib64/ld-2.10.1.so
    7f9a08056000-7f9a08059000 rw-p 7f9a08056000 00:00 0 
    7f9a08080000-7f9a08082000 rw-p 7f9a08080000 00:00 0 
    7f9a08082000-7f9a08083000 r--p 0001c000 08:01 1113151                    /lib64/ld-2.10.1.so
    7f9a08083000-7f9a08084000 rw-p 0001d000 08:01 1113151                    /lib64/ld-2.10.1.so
    7fff1006e000-7fff10083000 rw-p 7ffffffea000 00:00 0                      [stack]
    7fff101fe000-7fff101ff000 r-xp 7fff101fe000 00:00 0                      [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
    Aborted
    Mon programme réalloue de la mémoire dynamiquement de type geographiccoords qui est une structure contenant deux float : longitude et latitude.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            geographiccoords *amphipoints;
     
            for (i = 1 ; i < 32 ; i++) {
     
                    if(i == 1)
                            amphipoints = new geographiccoords[i];
                    else
                            amphipoints = new(amphipoints) geographiccoords[i];
     
                    amphipoints[i-1].longitude = (float)i;
                    amphipoints[i-1].latitude = (float)i;
            }
    Et lorsque le programme est fini je lance un
    delete [] amphipoints;
    mais cela abouti à l'execution à un problème de libération de mémoire (voir le output ci-deussus).

    Voici le code complet :

    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
     
    #include <iostream>
     
    typedef struct GeoGraphic {
     
            float longitude;
            float latitude;
     
    } geographiccoords;
     
     
    int main (void)
    {
     
            int i;
     
            geographiccoords *amphipoints;
     
            for (i = 1 ; i < 32 ; i++) {
     
                    if(i == 1)
                            amphipoints = new geographiccoords[i];
                    else
                            amphipoints = new(amphipoints) geographiccoords[i];
     
                    amphipoints[i-1].longitude = (float)i;
                    amphipoints[i-1].latitude = (float)i;
            }
     
          }
     
     
            for(i=0 ; i < 31 ; i++) {
                    std::cerr << amphipoints[i].longitude << std::endl;
                    std::cerr << amphipoints[i].latitude << std::endl;
            }
     
            delete [] amphipoints;
     
     
            return 0;
     
    }
    Savez-vous pourquoi la mémoire ne se libère pas correctement ?

    Merci,
    -------------------

    @(zmodai)+

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    euh ouais mais non. Tu es tombé par hasard sur le "placement new" ou tu sais ce que tu fais?

    sinon en C++ ton programme ça ressemblerait plus à :

    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
     
     
    #include <vector>
     
    struct GeoPoint
    {
        GeoPoint( float longitude, float latitude)
        : longitude_(longitude), 
          latitude_(latitude)
     
        float longitude_;
        float latitude_;
    };
     
    int main()
    {
        std::vector< GeoPoint> coords;
     
        coords.push_back( GeoPoint( 4.0, 40.0 ));
     
        // dans une boucle si tu veux
        for(int i = 0; i<32; ++i)
        {
            float x= static_cast<float>( i );
            coords.push_back( GeoPoint( x, x ) );
        }
    }

  3. #3
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       if(i == 1)
          amphipoints = new geographiccoords[i];
       else
          amphipoints = new(amphipoints) geographiccoords[i];
    Oula
    Quel est le but de ce bout de code exactement ?

    Edit : J'ai eu la flemme de taper une solution juste utilisant std::vector, mais nikko34 la fait ! +1 avec lui, c'est ce genre de code qu'il est préférable d'utiliser en C++.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 64
    Points : 43
    Points
    43
    Par défaut
    nikko: Oui je suis un peu perdu avec les opérateurs new/delete
    Et c'est pas les docs que j'ai trouvé qui m'aident vraiment ...

    merci pour l'usage de vector je connaissais pas ....

    Arzar:

    Si je traduit en C ça donnerait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    if(i == 1)
     amphipoint = malloc(sizeof(geographiccoords));
    else
     amphipoint = realloc(amphipoint, sizeof(geographiccoords) * i));
    c'est de la réallocation dynamique

    Avez-vous une idée du problème ?
    merci,
    -------------------

    @(zmodai)+

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Ben déjà si tu es perdu avec new/delete... ne les utilise pas? En C++ il est vivement déconseillé de faire des new pour le plaisir. ( et utilise vector! )

    Enfin, il n'y a pas d'équivalent de realloc, le placement new ce n'est pas du tout ce que tu penses que c'est.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 64
    Points : 43
    Points
    43
    Par défaut
    Ok merci, je vais jeter un coup d'oeil à vector ;-)
    -------------------

    @(zmodai)+

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

Discussions similaires

  1. Problème libération mémoire avec Delphi 7
    Par stef32550 dans le forum Bases de données
    Réponses: 1
    Dernier message: 31/08/2012, 18h40
  2. Problème libération mémoire
    Par scary dans le forum Débuter
    Réponses: 2
    Dernier message: 08/05/2009, 22h12
  3. problème libération mémoire dû aux user control
    Par grogui dans le forum Windows Forms
    Réponses: 25
    Dernier message: 30/03/2009, 09h29
  4. problème libération mémoire après une DLL
    Par salseropom dans le forum C
    Réponses: 22
    Dernier message: 03/09/2008, 12h51

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