Grosse Datenmengen mit malloc

Gast #4576486
Lesenswert?

Hallo,

Im Rahmen eines Projekt muss ich Speicher belegen um die Daten einer 
Datei auszulesen - vieel Speicher. Zumindest meint LeakSanitizer das.

Ich versuche ueber malloc ca. 120000byte zu belegen, bekomme beim 
ausfuehren allerdings die Fehlermeldung
1
Direct leak of 120000 byte(s) in 1 object(s) allocated from:


Ich habe leider keine Idee, wie ich das ganze umgehen kann. Ich bin fuer 
jeden noch so kleinen Tipp dankbar!

Cheers
Gast #4576577
Lesenswert?

> Du musst halt auch mal free() ausführen

oder die Warnung ignorieren. Meist ist malloc() ohne free() ein Fehler.

Wenn du den Speicher bis zum Programmende brauchst, kannst du das free() 
auch weglassen. Beim Programmende wird sowieso der ganze Speicher wieder 
freigegeben.
Gast #4576637
Lesenswert?

Waere echt cool wenn du auch mal sagen wuerdest um welchen 
compiler/tools es geht

http://clang.llvm.org/docs/LeakSanitizer.html
1
LeakSanitizer is only supported on x86_64 Linux.

Schau dir das Beispiel an. Das free() fehlt -> Bumm, fehlermeldung.
Zu jedem malloc gehoert auch ein free, zu jedem new ein delete.

Ja, am ende des programms koennte man es weglassen, ist aber nicht 
sauber.

abc schrieb:
> Ich versuche ueber malloc ca. 120000byte zu belegen, bekomme beim
> ausfuehren allerdings die Fehlermeldung
Das leakt (sorry, aber das wortspiel lass ich mir nicht nehmen :D ) aber 
nicht an malloc!

abc schrieb:
> Ich habe leider keine Idee, wie ich das ganze umgehen kann.
Umgehen schon mal gar nicht. Das Problem beheben ist das einzig richtige 
was du mach solltest, und das ist ganz einfach: ein free() einbauen.
Gast #4576785
Lesenswert?

Rainer V. schrieb:
> Oder vllt. hier unter "Suppressions" (Fehlermeldung unterdrücken):
> https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer

Wenn bei dir im Auto die Kühlwasser-Leuchte angeht, dann häckst du auch 
mit Riesen-Aufwand den Motor-Controller, um die Warnleuchte 
auszublenden, anstatt einfach Wasser nachzufüllen?

Anderer Vorschlag: das Programm in einer VM laufen lassen, den 
VM-Controller die Aktivität&Ausgabe vom LeakSanitizer erkennen lassen 
(einfache Bilderkennung & OCR), und mit einem kleinen, schwarzen, 
Always-On-Top Popup die Fehlermeldung im Fenster abdecken?

Meine Vermutung: der TE will die Datei sowieso nur einmal von Anfang bis 
Ende Zeilenweise durchlesen, Lösungsvorschläge mit mmap, und/oder 
korrekter Verwendung von free() gehen am eigentlichen Problem vorbei.
Persönliche Seite #4576848
Lesenswert?

Oliver S. schrieb:
> Selbst im Original-PC mit 640kB RAM waren 117kB nicht wirklich "vieel".

Aber nur sehr kompliziert anzusprechen, weil das mehr als 64 kB sind. 
Dank der Segmentitis, an der der PC damals (oder lange danach noch im 
"real mode") litt, bedurfte es dort aufwendiger Konstruktionen 
(Speichermodell "huge"), um mit Datenblöcken zu hantieren, die mehr als 
ein Segment belegten. Und das war natürlich eine Performancebremse.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren