2016-10-08 4 views
4

Das ist, was ich erhalten, nachdem mein Programm mit Valgrind Ausführung:Valgrind wirft keinen Fehler, aber nicht alle Heapzuweisungen befreit wurden

1 [email protected]:~/ClionProjects/algo2-t4-tries$ g++ Set.hpp tests.cpp DiccString.hpp && valgrind --leak-check=yes --show-leak-kinds=all ./a.out      
2 ==6823== Memcheck, a memory error detector 
3 ==6823== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. 
4 ==6823== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info 
5 ==6823== Command: ./a.out 
6 ==6823== 
7 test_empty_dicc...ok 
8 test_copy_constructor...ok 
9 test_define_defined...ok 
10 test_get..ok 
11 test_remove...ok 
12 test_remove_tiny...ok 
13 test_keys...ok 
14 ==6823== 
15 ==6823== HEAP SUMMARY: 
16 ==6823==  in use at exit: 72,704 bytes in 1 blocks 
17 ==6823== total heap usage: 282 allocs, 281 frees, 275,300 bytes allocated 
18 ==6823== 
19 ==6823== 72,704 bytes in 1 blocks are still reachable in loss record 1 of 1 
20 ==6823== at 0x4C2DC10: malloc (vg_replace_malloc.c:299) 
21 ==6823== by 0x4EC3EFF: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21) 
22 ==6823== by 0x40104E9: call_init.part.0 (dl-init.c:72) 
23 ==6823== by 0x40105FA: call_init (dl-init.c:30) 
24 ==6823== by 0x40105FA: _dl_init (dl-init.c:120) 
25 ==6823== by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so) 
26 ==6823== 
27 ==6823== LEAK SUMMARY: 
28 ==6823== definitely lost: 0 bytes in 0 blocks 
29 ==6823== indirectly lost: 0 bytes in 0 blocks 
30 ==6823==  possibly lost: 0 bytes in 0 blocks 
31 ==6823== still reachable: 72,704 bytes in 1 blocks 
32 ==6823==   suppressed: 0 bytes in 0 blocks 
33 ==6823== 
34 ==6823== For counts of detected and suppressed errors, rerun with: -v 
35 ==6823== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

Es scheint, als gäbe es keine undichten Stellen als letzte Zeile der Ausgabe sind, sagt . Und doch haben wir auch diese Zeile:

17 ==6823== total heap usage: 282 allocs, 281 frees, 275,300 bytes allocated 

Wie ist, dass ich keine Fehler haben, aber es gibt immer noch eine Zuordnung, die freigegeben wurde nicht? Ist etwas nicht in Ordnung mit meinem Programm oder etwas, das von Valgrind hinter den Kulissen getan wird?

+1

* Ich werde hier meinen Code nicht schreiben, weil es keine Lecks gibt * - Berühmte letzte Worte. Warum sind Sie so sicher, dass Ihr Programm keine Speicherlecks hat? – PaulMcKenzie

+2

Das sieht wie ein statisches Anfangsleck aus. Ich nehme an, Sie besitzen nicht den 'dl-init.c' Code, richtig? Es ist wahrscheinlich nur Startup-Code für die Laufzeitbibliothek. Requisiten für die Verwendung von Valgrind, BTW. – WhozCraig

+0

@PaulMcKenzie Ich bin nicht ... mein Punkt war, dass Valgrind sagt, dass es nicht (wie ich verstehe). Also, basierend auf der Prämisse, dass, wenn ich ein Leck hatte, würde es als ein Fehler geworfen werden (richtig?), Ich habe es einfach vermieden, einen Haufen Code hier zu platzieren, den ich für die Frage selbst für unnötig hielt. – jscherman

Antwort

4

Das von Valgrind gemeldete Backtrace zeigt, dass die fragliche Speicherzuordnung in der Initialisierungsfunktion einer der von der Anwendung geladenen gemeinsam genutzten Bibliotheken vorgenommen wurde, offensichtlich die C++ - Bibliothek selbst.

Es ist ziemlich üblich für gemeinsam genutzte Bibliotheken, einmalige Zuordnungen für verschiedene Bits und Daten zu machen, aber nicht die ausdrückliche Freigabe zu verweigern, wenn sie entladen werden.

Dies umfasst kein Speicherleck in Ihrem eigenen Code.

valgrind enthält eine Liste bekannter Zuordnungen dieser Art, die als "Unterdrückungsliste" bezeichnet wird, um Berichte über diese bekannten einmaligen Zuweisungen zu unterdrücken.

Aber manchmal, diese Unterdrückung Listen verpassen eine Zuordnung, oder zwei.

Verwandte Themen