string in einer schleife allokieren
-
moin.
was passiert eigentlich, wenn man das hier macht?
for(long i = 0; i < 17000000;i++) { char string[100] = {'1','2','3','4'...} }wird in jeder Iteration ein neuer Bereich im HPS allokiert, oder wird jedesmal der alte überschrieben?
-
Wird vom compiler wegoptimiert

-
also ich hatte gerade ein selbsgebautes programm laufen, dass mehrere Millionen male solche Schleifen benutzte und nach einer Stunde ist alles zum erliegen gekommen und die reaktionszeit war sehr langsam...
könnte es nicht sein, das der Compiler doch nicht alles optimal optimiert und ich doch lieber alles deallokieren sollte?
-
sharp schrieb:
also ich hatte gerade ein selbsgebautes programm laufen, dass mehrere Millionen male solche Schleifen benutzte und nach einer Stunde ist alles zum erliegen gekommen und die reaktionszeit war sehr langsam...
könnte es nicht sein, das der Compiler doch nicht alles optimal optimiert und ich doch lieber alles deallokieren sollte?
Das wird interessant....
Wie deallokierst du das (char[]) denn? ^^Nach mehreren Stunden klingt so, als ob du iwo Pointer benutzt und das delete vergisst...
Aber ohne Quelltext wird dir hier wohl keiner weiterhelfen können...
Und dann solltest du dazu noch verraten, welchen Compiler du nutzt - allerdings glaub ich nicht daran, dass es nen Compiler gibt, der dumm genug ist, das (was du gepostet hast) nicht wegzuoptimieren...bb
-
Das wird interessant....
Wie deallokierst du das (char[]) denn? ^^nicht mit free(nameOfString) ?
Nach mehreren Stunden klingt so, als ob du iwo Pointer benutzt und das delete vergisst...
nop. keine Pointer.
Aber ohne Quelltext wird dir hier wohl keiner weiterhelfen können...
ich glaube ab einer gewissen Größe macht es gar keinen Sinn es zu posten, weil niemand die Lust hast sich da einzuarbeiten...hab ich schon versucht:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-233049.html
Und dann solltest du dazu noch verraten, welchen Compiler du nutzt
gcc natürlich. was den sonst
?
-
sharp schrieb:
Das wird interessant....
Wie deallokierst du das (char[]) denn? ^^nicht mit free(nameOfString) ?
Doppelt böse!
In C++ wenn schon mit delete, aber das ist auch böse. Du darfst nur den Speicher freigeben, den du auch angefordert hast!Ob es ein Memleak ist sagt dir z.B :
http://valgrind.org/
-
danke für den link.
-
Ist das denn noch keinem aufgefallen? Hier gehts nicht um dynamische Speicherverwaltung oder Memory Leaks...
Variablen, die automatische Speicherklasse ("Stack") haben, muss man weder freigeben noch können sie Leaks verursachen. Sie werden am Ende des Blocks zerstört. Folglich sind sie in einer neuen Iteration nicht mehr existent.
Dazu gehört auch
char string[100] = {'1','2','3','4'...}
-
Nexus schrieb:
Ist das denn noch keinem aufgefallen? Hier gehts nicht um dynamische Speicherverwaltung oder Memory Leaks...
Variablen, die automatische Speicherklasse ("Stack") haben, muss man weder freigeben noch können sie Leaks verursachen. Sie werden am Ende des Blocks zerstört. Folglich sind sie in einer neuen Iteration nicht mehr existent.
Dazu gehört auch
char string[100] = {'1','2','3','4'...}Das haben wir schon richtig verstanden, aber die ursprüngliche Frage war, ob es überschrieben wird, was nicht unbedingt sein muss, dann hat er aber im dritten Post gesagt, dass das Programm nach ein paar Stunden zum erliegen kommt und das klingt sehr danach, dass irgendwo anders im Code der Hase begraben liegt.
- Und es ist nach der Erklärung sehr wahrscheinlich ein Memory Leak.
-
Aber er sagte ausdrücklich, er verwende keine Zeiger. Ohne Zeiger Memory Leaks zu erzeugen ist... schwierig.
-
Nexus schrieb:
Aber er sagte ausdrücklich, er verwende keine Zeiger. Ohne Zeiger Memory Leaks zu erzeugen ist... schwierig.
Nö.
new int[100];Ich benutze da keine Zeiger.

Kann natürlich auch aus einer lib sein, wo er ein dazugehörigens release, close usw. nicht aufruft.. Ansonsten können wir ohne Code nicht viel sagen.
-
So langsam spekulieren wir...

sharp schrieb:
also ich hatte gerade ein selbsgebautes programm laufen, dass mehrere Millionen male solche Schleifen benutzte und nach einer Stunde ist alles zum erliegen gekommen und die reaktionszeit war sehr langsam...
Ich bin hier mal davon ausgegangen, dass er die Sache einigermassen richtig abstrahiert hat. Klar ist es nicht schlecht zu erwähnen, dass generell Memory Leaks entstehen können, aber mit solchen Schleifen eben nicht.
Aber Code zeigen wäre wahrscheinlich das Einfachste...

-
Nexus schrieb:
So langsam spekulieren wir...

sharp schrieb:
also ich hatte gerade ein selbsgebautes programm laufen, dass mehrere Millionen male solche Schleifen benutzte und nach einer Stunde ist alles zum erliegen gekommen und die reaktionszeit war sehr langsam...
Ich bin hier mal davon ausgegangen, dass er die Sache einigermassen richtig abstrahiert hat. Klar ist es nicht schlecht zu erwähnen, dass generell Memory Leaks entstehen können, aber mit solchen Schleifen eben nicht.
Das es nicht daran liegen kann/sollte war imo von Anfang an klar, darum den Hinweis, dass es sehr wahrscheinlich irgendwo anders und was mit dynamischer Allokation zu tun hat..
Das Problem ist ja, dass man als Anfänger die Probleme meist nicht da sucht, wo sie sind. Siehe Titel und das eigentliche Problem, dass er hat. Er fängt an etwas von Schleifen zu reden, kommt aber später damit, dass eigentlich sein Programm nach ein paar Stunden zum erliegen kommt und das hat einmal grundsätzlich nichts mit dem zu tun, was am Anfang angesprochen wurde..
-
Da stimme ich dir schon zu. Ich hatte beim Lesen des Threads nur das Gefühl, es wurde nicht eindeutig genug dargestellt, dass das
char-Array mit Sicherheit nicht der Grund für das Erliegen/Langsamer Werden sei.Sollte kein Vorwurf sein...
