Forum: PC-Programmierung memory leak?oder doch nicht?


von Flutsch1987 (Gast)


Lesenswert?

moin,
ich hab eigentlich ne ganz kurze Frage:
Wenn ich in C++ mit
1
int *ptr1, *ptr2;
2
ptr1 = new int[10];
3
ptr2 = new int[10];
dynamisch zwei arrays erstelle und anschließend per
1
delete[] ptr1, ptr2;
wieder lösche, wird doch wirklich der speicher beider arrays wieder 
freigegeben, oder?
Valgrind meldet dann nämlich immer das der speicher von ptr2 nicht 
freigegeben wurde..

die einfachste methode das zu umgehen ist natürlich einfach
1
delete[] ptr1;
2
delete[] ptr2;
zu schreiben, allerdings wurde im gesamtem Projekt das ich bearbeite mit 
einer delete[] anweisung der speicher mehrerer arrays wider frei gegeben 
und das umzuschreiben, nur weil valgrind das nicht erkennt wäre ja 
zuviel des guten...

von Web-Applikator (Gast)


Lesenswert?

delete[] ptr1, ptr2;

Löscht ptr1, und wertet nachher die Addresse von ptr2 aus, nur um sie 
wieder zu verwerfen (wird wegoptimiert).

=> Im C-Buch den Komma (,)-Operator nachlesen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Flutsch1987 schrieb:
> dynamisch zwei arrays erstelle und anschließend perdelete[] ptr1, ptr2;
> wieder lösche, wird doch wirklich der speicher beider arrays wieder
> freigegeben, oder?

Nein, das geschieht nicht, wie schon "Web-Applikator" sehr richtig 
erkannt hat.

Diesen Programmierfehler musst Du in Deinem kompletten Quelltext 
beseitigen.

Suche nach Zeilen, in denen das Wort "delete" und ein Komma auftaucht.

von Flutsch1987 (Gast)


Lesenswert?

hm,
das ist natürlich ärgerlich...das einzig gute daran ist das wenigstens 
nicht nur ich solch blöde fehler mach :) (projekt ist nicht von mir 
geschrieben)

vielen dank für die schnelle Hilfe.

von Web-Applikator (Gast)


Lesenswert?

Die GCC warnt übrigens bei solchen Konstrukten.

test.c:3: warning: right-hand operand of comma has no effect

bzw

test.c:3: Warnung: right-hand operand of comma hat keinen Effekt

;)

==> Projekt mit -Wall -Werror kompilieren. Wenn das erstmal klappt, 
wieder zum valgrind zurück.

von digit (Gast)


Lesenswert?

ab heute darfst du nun auch so einen code schreiben

x = mache_irgendwas(), y;

:)

von Web-Applikator (Gast)


Lesenswert?

Auch nett:
1
double test;
2
test=1,2345;


test hat nachher den Wert 1.0, und der Compiler warnt nichtmal.

von Klaus (Gast)


Lesenswert?

Web-Applikator schrieb:
> double test;
> test=1,2345;

> test hat nachher den Wert 1.0, und der Compiler warnt nichtmal.

Wie hinterhältig!!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.