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 :
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
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
Et lorsque le programme est fini je lance un
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; }
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 :
Savez-vous pourquoi la mémoire ne se libère pas correctement ?
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; }
Merci,
Partager