Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
075
14.12.2002, 20:10
gerk



Ich habe bis vor gestern Abend gedacht, dass wenn man Speicher mit new alloziert, und ihn nicht mit delete frei gibt, er verloren (auch nach beenden des programmes) bleibt. Darum habe ich immer _peinlichst_ genau darauf geachtet, new-speicher asap frei zu geben.

Mein Weltbild ist erschüttert.

Naja egal, meine neue Frage lautet:
Gibt das Betriebssystem, wenn man einen Prozess manuell (Xkill/Taskmanager) beendet, den vom Programm belegten Heap- und Stackspeicher automatisch wieder frei?

Greets,
Lag

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“

zum Seitenanfang zum Seitenende Profil || Suche
076
15.12.2002, 00:15
Tron



Zitat:
Mein Weltbild ist erschüttert.

wieso ist es das?

bei win 95/98 ist der speicher, wenn man ihn nicht wieder freigibt futsch.
*x ist da natuerlich souveraen und gibt den nicht freigegebenen speicher seines prozesses natuerlich frei.
win nt/2k koennten (nur vermutung) auch so schlau sein und den speicher freigeben.

kod hat einfach noch einige leaks durch logikfehler in seinem programm.

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
077
15.12.2002, 12:02
gerk



1) Nur so

2) Was ist kod?

Da, meine Antwort auf deinen Post nur 25 Zeichen betragen würde, schreibe ich diese Zeile dazu, damit's nach mehr aussieht :)

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“

zum Seitenanfang zum Seitenende Profil || Suche
078
15.12.2002, 14:09
Tron



King of Darkness

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
079
15.12.2002, 15:29
gerk



Rotfl, Ich dachte das sei ein Programm. Wär irgendwie unlogisch :)

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“

zum Seitenanfang zum Seitenende Profil || Suche
080
15.12.2002, 16:00
CN



ich dachte du meinst "kot" o_O
sowie hanky

--

zum Seitenanfang zum Seitenende Profil || Suche
081
16.12.2002, 07:48
King of Darkness



MHHH, beschmutz meinen namen nicht !!!

zum thema, logikfehler kann ich nicht erkennen, wenn ich aber bei mir (win2k) beim taskmanager den karteireiter prozesse anklicke dann schwankt da der speich beim "freigeben" so langsam nach unten wobei was ich auch nicht verstehe: bei 770000 objekt ja ihr habt richtig gelesen 770000, braucht das ding so ca 500 bis 600 mb (jedenflas zeigt das der taskmanager im bereich systemleisung an)

ich flehe euch an bitte helft mir, ich bin am verzweifeln

den atuellen code sollte ich irgendwo mal hochladen, oder wer will dem sende ich es per mail

--

Coding Center --- Tutorials über Programmierung und andere Themen
Amazon Preisbeobachung mit Preisalarm

zum Seitenanfang zum Seitenende Profil || Suche
082
16.12.2002, 15:07
apfelkorn



mh... klar, win95 und 98 und me sind zwar offiziell protected-mode-betriebssysteme, aber das war dann wohl nur halb durchdacht, aber ansich sollte jedes betriebssystem, das einen prozess killt auch in der lage sein den allozierten speicher wieder freizugeben (es gibt auch die möglichkeit einen pointerfriedhof zu basteln, in dem alle allozierten speicheradressen dann zwischengespeichert werden bis zum beenden des programms)

--

zum Seitenanfang zum Seitenende Profil || Suche
083
16.12.2002, 15:18
Kriz



Tja, sowas machen ja Garbage Collectors. Die sammeln erstmal alles Alloziierte an und prüfen dann mehr oder weniger regelmäßig, ob das Objekt noch gebraucht wird. Ansonsten wird es dann weggekickt. Aber diese GCs sind mir irgendwie zu uberevil, da es einige Sachen gibt, die ... äh.. uberevil sind:

1. Man weiß nie, wann der Sack anfängt mal wieder seinen Heap auszumisten
2. Destruktoren bei OOP-Sprachen sind total überflüssig, können beim Einsatz sogar schwerste Programmfehler erzeugen, da man nie weiß, ob der Destruktor seine Arbeit auch verrichten kann, ehe der GC das Objekt killt.
3. Stets läuft ein niederprioritativer Thread mit, wo der GC dann rumgeistert.
4. Kackt der GC ab, kackt alles ab, da der GC ja als Thread mit der RTE des Programms konstruiert wird und daher fundamental ist.

Nee nee, GC's sind nicht sehr doll (siehe Java, SmallTalk usw.)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
084
16.12.2002, 19:47
Tron



Zitat:
zum thema, logikfehler kann ich nicht erkennen

aber hallo!

erzeuge eine instanz von objektliste:
Quellcode:    objektliste()
    {
        pErstes = new liste;      
        pObjekt = new liste;      
        pLetztes = new liste;
        pNext = 0;
        pBefore = 0;
        pTemp = 0;
        Laenge = 0;

    }

und fuehre damit gleich die methode SetToBegin aus:
Quellcode:int objektliste::SetToBegin()
{
    if(pErstes)
    {
        pObjekt = pErstes;;
        return true;
    }
    else
    {
        return false;
    }
}

und schon ist das objekt, auf das pObjekt nach der konstruktion geziegt hat, verwaist.

den konstruktor verstehe ich sowieso nicht: warum macht er das, was er macht?

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
085
17.12.2002, 09:31
King of Darkness



ja gut das habe ich aber schon beseitigt, der code is nich mehr ganz aktuell ;)

--

Coding Center --- Tutorials über Programmierung und andere Themen
Amazon Preisbeobachung mit Preisalarm

zum Seitenanfang zum Seitenende Profil || Suche
086
03.01.2003, 13:44
King of Darkness



ok problem gelöst mit der liste, ich habe die liste einfach nur falsch zusammen gebaut (scheint mir so)

aber nun mal ne andere frage

wenn sollte man ne referenz einsetzen und wann nen zeiger ?

--

Coding Center --- Tutorials über Programmierung und andere Themen
Amazon Preisbeobachung mit Preisalarm

zum Seitenanfang zum Seitenende Profil || Suche
087
03.01.2003, 19:04
gerk



Referenzen dürfen nicht Null sein und können nicht erneut zugewiesen werden.
Zeiger. Dafür sind sie laut Buch leichter handzuhaben und bequemer.

Zeiger sind dafür aber "gefährlicher" aber auch flexibler, meint eines der schlauen Bücher.

Grüße,
Zgerk

Edit:
Ich verwende im Moment Referenzen nur, wenn ich einen Übergabewert brauche, sprich die Funktion übernimmt nur einen Wert/Objekt/sonst was, um den Werten/Objekten was anzustellen. Klar? Nun, wenn ich mir sicher bin, dass die Referenz sich auf nichts anderes mehr beziehen muss. (Kann sie ja gar nicht)

Zum Thema Nullreferenzen:
Wenn eine Referenz den Wert Null hat, ist das Programm nicht gültig. Was heißt das? Das heißt, dass es im besten Fall "abkackt".

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“


Dieser Beitrag wurde am 03.01.2003 um 19:11 von Zgerk bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
088
04.01.2003, 14:54
King of Darkness



danke, und was bringt mehr performence, zeiger oder ?

--

Coding Center --- Tutorials über Programmierung und andere Themen
Amazon Preisbeobachung mit Preisalarm

zum Seitenanfang zum Seitenende Profil || Suche
089
04.01.2003, 14:55
Prefect



Quellcode:
int* a = 0;
int& b(*a);

b = 5;

:P

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
090
04.01.2003, 15:48
gerk



Warum werden beim Operator-Overloading manche Operanden (ist doch die Mehrzahl, oder?) als eigene Funktionen und dann als friend der entsprechenden Klasse und manche als Klassenmethoden implementiert?

Die "friend"-Versionen hab ich vorwiegend bei Rechenoperatoren gesehen.

Grüße,
Zgerk

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“

zum Seitenanfang zum Seitenende Profil || Suche
091
04.01.2003, 18:50
King of Darkness



waru das friend ist weis ich nicht aber das mit dem operator-overloading glaube ich zu wissen

das diehn dazu um zb verktoren zu addieren oder andere dinge die man nicht "normal" addieren(oder was auch immer) will
ok nich sehr einläuchtent oder, ein versuch wars wert

--

Coding Center --- Tutorials über Programmierung und andere Themen
Amazon Preisbeobachung mit Preisalarm

zum Seitenanfang zum Seitenende Profil || Suche
092
04.01.2003, 21:39
Prefect



Es heißt Operatoren. Operanden sind die Dinger, an denen vom Operator rumopereriert wird.

Ich weiß ehrlich gesagt gar nicht ob es von der Syntax her irgendwelche Beschränkungen gibt, aber es macht durchaus von der Konvention her Sinn. Vergleiche zum Beispiel mal operator+= und operator+. Der operator= kommt bei einem Codeschnippsel wie a += b zum Einsatz. Dabei wird das Objekt a modifiziert, es ist fast so, als würde eine Funktion von a aufgerufen werden. Der Operator "gehört" also zum Objekt a und wird dementsprechend als Memberfunktion implementiert.
Beim operator+ hast du so etwas wie a + b. Da die Addition kommutativ ist sind die beiden Operatoren absolut gleichwertig. Du kannst nicht sagen, daß der Operator zum einen Objekt mehr "gehört" als zum anderen. Also macht es weniger Sinn, den Operator als Member einer Klasse zu implementieren - also bleibt noch eine globale Funktion (und da soll noch einer behaupten globale Variablen/Funktionen haben in einer OOP-Situation nichts zu suchen).

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
093
04.01.2003, 21:59
Tron



es macht genau keinen unterschied ob man
class A { A operator + (const A&); };
oder
class A {};
A operator + (const A&, const A&);
verwendet. (natuerlich mit entsprechender implementierung)

ist eine frage des stils und geschmacks, wie prefect schon angedeutet hat, bietet es sich an +=, -=, ... als methoden zu implementieren, das das 'passender' erscheint.
allerdings sollte man erwaehen, dass der operator = _nicht_ bei += verwendet wird, sondern nur +=.
zudem wuerde ich nicht mit der kommutativitaet bei + argumentieren, sondern, dass das ergebnis ein eigenes, neues objekt ist, weder A, noch B. (nicht gezwungenermasen, es hindert einem keinen daran, A + B so zu defieneren, dass A mit B multipliziert wird... ausser der desunde menschenverstand, falls vorhanden)

einzige ausnahme waere
A operator + (float, const A&);
das geht natuerlich nicht in einer klasse, da der klinke parameter ein nativer typ ist.

zu friend:
wenn eine klasse eine andere klasse/funktion als freund deklariert, dann darf diese andere klasse/funktion auf die geschuetzten und privaten methoden und variablen der klasse zugreifen. das braucht man, falls operatoren auserhalb der klasse deklariert werden, aber auf geschuetzte/private sachen der klasse zugreifen muessen. (wenn es keine oeffentlichen zugriffsmethoden gibt)

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
094
21.01.2003, 18:50
Gnomo



Mal ´ne andere Frage. Was ist "richtiger" C++ Stil? Es wird zwar viel darüber geredet, aber niemand weiß wirklich eine Antwort.

--

zum Seitenanfang zum Seitenende Profil || Suche
095
22.01.2003, 11:07
Kriz



Dafür gibt es keine Antwort, Gnomo, wie der Stil auszusehen hat. Man kann alles ineinanderfummeln zu einem Klops oder es fein säuberlich aufreihen und trennen. Das ist halt der "Nachteil" formatfreier Sprachen =)

Allerdings gibt es syntaktische Stile, die nicht nur "professioneller" aussehen (was auch immer man darunter verstehen mag), sondern ab und an auch die Performance eines Programms deutlich beschleunigen können. Ich rede hierbei nicht von optimierten Datenstrukturen oder Algorithmen, sondern von optimiertem Einsatz von C++ Sprachelementen!

Beispiel Stringkopieren (gilt btw. auch für C):

Der normale Coder würde eine for-Schleife verwenden, um zeichenweise einen String in einen anderen zu kopieren. Als Restriktion dient dabei die Länge des Quellstrings (ohne '\0' als Terminator).

Das ist aber irgendwie laienhaft. Wenn man gewisse Basisdinge weiß, dann kann man das Stringkopieren erheblich vereinfachen und beschleunigen. Ich führe das hier mal etwas ausführlicher aus, damit man auch versteht, was Sache ist.

Zuerst muß man sich erstmal klarmachen, was ein "String" in C/C++ ist. Ein String ist...

a) kein Array von Zeichen, sondern ein Zeiger auf das erste Zeichen
b) (quasi) beliebig lang, da er nicht durch eine vorgegebene Feldanzahl begrenzt wird, sondern durch ein Terminatorzeichen (dem '\0').
c) durch seine Zeigerstruktur mit Zeigerarithmetik behandelbar (geht zwar auch bei char-Arrays, aber ist beim String offensichtlicher)

Wenn man diese drei Punkte begriffen hat, kann man nun effektiv das Kopieren eines Strings über die Zeigerarithmetik in Angriff nehmen. Dazu benötigt man...

a) einen Quellstring
b) einen Zielstring

Jetzt muß man wieder etwas nachdenken. Der Quellstring (qs) sollte eigentlich nicht verändert werden durch das Kopieren, weshalb man ihn als konstant betrachten muß. Dagegen muß der Zielstring (zs) nichtkonstant sein, denn er wird ja verändert. Darüberhinaus muß zs mindestens die gleiche Menge Zeichen aufnehmen können wie qs Zeichen besitzt:

L() = Stringlänge inkl. '\0'

L(zs) >= L(qs)

Kommen wir zur der Implementierung. Meistens erfüllen Funktionen/Methoden die Aufgabe des Stringkopierens. Man muß qs und zs daher als Argumente an die Parameterliste einer Kopierfunktion übergeben. Hierbei darf man nicht vergessen, daß es bei der Übergabe von Strings an Funktionen/Methoden eine Einschränkung gibt! Aufgrund der Tatsache, daß ein Zeiger auf 32 Bit Plattformen stets auch als 32 Bit Adresse an die Funktion/Methode übergeben wird, kann man nicht mehr auf die Länge des Strings zurückgreifen. Diese Information geht definitiv verloren in der Parameterliste! Das ist btw. auch der Grund, wieso bei der Übergabe von Arrays auch immer die Größe des Arrays mitübergeben wird.

Die einzige Information, die man über die Länge eines Strings erfahren kann, ist die Indexposition des Terminators ('\0') + 1. Das gilt allerdings nur für qs. zs dagegen ist in der Regel "leer" ohne Terminator. Zudem ist die Länge von zs nirgends definiert! zs ist nur ein Zeiger auf char, mehr nicht. Das ist aber für das Stringkopieren ein Ding der Unmöglichkeit. Daher muß vorher garantiert werden, daß zs weder NULL ist oder die obige Restriktion nicht erfüllt! Das erreicht man nur, wenn zs als char-Array mit entsprechender Anzahl von Feldern existiert oder als dynamisch erzeugter String mit entsprechender Länge (inkl. dem Terminatorzeichen!).

Also muß zs char[] sein oder char* mit entsprechenden, alloziierten Speicher.

Das Kopieren erfolgt wie gesagt am effektivsten über Zeigerarithmetik. Da man einen Zeiger dereferenzieren kann mit dem *-Operator und einen Zeiger mit ++ auch imkrementieren kann, kann man diese beiden Operatoren perfekt zusammenführen für das Stringkopieren. Der Code lautet simplerweise:

Quellcode:while( *zs++ = *qs++);*qs liefert das erste Zeichen des Quellstrings, welches nach *zs kopiert wird. Danach werden beide Zeiger inkrementiert, also im Falle von char als Datentyp um 8 Bit (1 Byte) im Speicher weitergesetzt. Da die logische Auswertung innerhalb von while() solange true ist, wie *zs nicht den Terminator als Zeichen zugewiesen bekommt ('\0' ist wertemäßig auch 0 = false), bricht while() auch nicht ab.

Erst wenn *qs den Terminator liefert und diesen *zs zugewiesen hat, bricht while() ab, da while() false wird. In diesem Fall ist der komplette String kopiert worden mit praktisch fundamentalen Sprachmitteln. Und inkl. dem Terminator...

Als Funktion wäre das:

Quellcode:char* strcpy(const char* qs, char* zs)
{
    while(*zs++ = *qs++);
    return zs;
}
Cu

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche