Wo "delete[]" setzten, wenn Array mit return aus Funktion übergeben werden soll + Exception notwendig?
-
drakon schrieb:
Da wird dann aber nie bad_alloc ausgelöst, weil du ja (wie man das am besten macht) vorher schaut, ob es überhaupt genug Speicher hat.
Vorher nachsehen bringt nichts, es gibt keinerlei Garantie, daß das anschließend klappt. So nebenbei, was willst Du da vorher alles nachsehen?
Z.B. auf einem UNIX kann man den Speicher für Prozesse eingrenzen, so daß zwar massig Speicher im System frei ist, aber man diesen gar nicht allozieren kann. Richtig toll ist das mit parallel laufenden Prozessen, die man nicht unter Kontrolle hat. Wie soll man deren Laufzeitverhalten vorhersagen können?
-
Fruchti schrieb:
...
Ich möchte auch nochmal betonen, dass Du hier versuchst, die Konsequenzen einer schlechten Entscheidung auszubügeln: Solche "Erzeugerfunktionen" verursachen eben genau diese Probleme, weswegen man sie möglichst meiden sollte.
Ich habe immer noch nicht begriffen, warum Du meinst, sowas zu brauchen... und warum Du keinen Std-Container (vector&Co) verwenden willst: Das Teil kannst Du genauso verwenden wie ein Array und Du bist alle diese Probleme los...Gruß,
Simon2.
-
Simon2 schrieb:
Fruchti schrieb:
...
Ich möchte auch nochmal betonen, dass Du hier versuchst, die Konsequenzen einer schlechten Entscheidung auszubügeln: Solche "Erzeugerfunktionen" verursachen eben genau diese Probleme, weswegen man sie möglichst meiden sollte.
Ich habe immer noch nicht begriffen, warum Du meinst, sowas zu brauchen... und warum Du keinen Std-Container (vector&Co) verwenden willst: Das Teil kannst Du genauso verwenden wie ein Array und Du bist alle diese Probleme los...Gruß,
Simon2.
Es ist ja nicht so, dass ich den Std-Container nicht verwenden will, sondern es verhält sich eher so, dass ich bis dato noch nicht weiß, wie man diesen Container benutzt. Ich versuche mich in diesen Sachverhalt, der neu für mich ist, einfach noch reinzufinden und habe bisher eben versucht das Programm im Rahmen meiner Möglichkeiten und Kenntnisse aufzubauen.

(Und war froh, dass es so funktionierte.)Aber ich versuche es noch umzubauen und damit zu verbessern.
Und bei den Exceptions war es ähnlich, ich habe mich einfach versucht im Internet durch viele Beispiele und Tutorials zu lesen, bin bei den Exceptions vorbeigekommen und dachte: prima, probierst du einfach mal aus...
es ist ja schließlich doch immer so: durch Fehler lernt man.
-
Es ist ja nicht so, dass ich den Std-Container nicht verwenden will, sondern es verhält sich eher so, dass ich bis dato noch nicht weiß, wie man diesen Container benutzt.
Die Standardcontainer sind bei weitem einfacher zu benutzen, als irgendwelches Array gefrikel.
Sobald du dich ein wenig mit der Syntax angefreundet hast und weisst, was templates sind ist es eine enorme Erleichterung. Dazu kommt noch, dass, wenn du einen Container kennst praktisch alle anderen auch benutzen kannst. (gibt immer ein paar spezielle Sachen, aber das ist auch trivial).
-
Nur um mal einige Vorteile der STL-Container zu nennen:
- Bequemes Einfügen und Löschen von Elementen.
- Einfaches Durchiterieren und Ermitteln der Grösse möglich.
- Speicherverwaltung wird einem abgenommen; Elemente werden automatisch zerstört, kopiert und zugewiesen, wenn benötigt.
- Man hat ein Objekt vorliegen, während rohe Arrays oft wie Zeiger gehandhabt werden (z.B. Übergabe an Funktionen).
- Je nach Anwendung sind andere Datenstrukturen (verkettete Liste, Binärbaum) besser geeignet als lineare Arrays.
Als Einführung in die Standard Template Library gibt es hier im Forum gerade drei empfehlenswerte Artikel:
1) Container
2) Iteratoren und Algorithmen
3) Hilfsklassen und Erweiterungen
-
Nexus schrieb:
Nur um mal einige Vorteile der STL-Container zu nennen:
- Bequemes Einfügen und Löschen von Elementen.
- Einfaches Durchiterieren und Ermitteln der Grösse möglich.
- Speicherverwaltung wird einem abgenommen; Elemente werden automatisch zerstört, kopiert und zugewiesen, wenn benötigt.
- Man hat ein Objekt vorliegen, während rohe Arrays oft wie Zeiger gehandhabt werden (z.B. Übergabe an Funktionen).
- Je nach Anwendung sind andere Datenstrukturen (verkettete Liste, Binärbaum) besser geeignet als lineare Arrays.
...
- Einige Implementierungen bieten "range checking" - zumindestens an/abschaltbar - an.
... denn die Anlage von Arrays ist üblicherweise nur der erste Schritt - danach kommen üblicherweise die Threads "Warum schmiert mein Programm ab?".

Gruß,
Simon2.
-
Simon2 schrieb:
- Einige Implementierungen bieten "range checking" - zumindestens an/abschaltbar - an.
Das ist sogar bei allen Implementierungen gegeben - wenn Du die Methode at() benutzt.

-
Oder man debuggt halt wie jeder normale Mensch und stösst auf Assertions.

-
Nexus schrieb:
Oder man debuggt halt wie jeder normale Mensch und stösst auf Assertions.


Den Hinweis bekomme ich nicht mehr in den Diskussionszusammenhang: Ist dsas jetzt ein Argument für/gegen die Verwendung von STL-Containern oder at() oder operator[] oder ... ?
Oder musst das einfach mal gesagt werden ?
Gruß,
Simon2.
-
Simon2 schrieb:
Oder musst das einfach mal gesagt werden ?

Wohl am ehesten das.

Das "normale Mensch" könnte falsch verstanden werden, da hast du Recht. Ich wollte nur darauf hinweisen, dass man gerade so gut im Debug-Modus auf Out-Of-Ranges prüfen kann.
-
Also auch wenn ich bei den letzten Aussagen nicht mehr ganz mitkomme, danke für euer Hilfe! Ich habe es heute geschafft mein Programm vollständig auf vector umzustellen und hab alle Pointer und Arrays rausgeschmissen und er rechnet mir immer noch richtige Werte aus.

Ich werde zwar noch viel Übung brauchen, bis ich vollständig dahintergestiegen bin, aber es war ein guter Anfang. Hab auch überall at() benutzt.

Ich hoffe damit speichermäßig nicht mehr auf Probleme zu stoßen.
-
Fruchti schrieb:
er rechnet mir immer noch richtige Werte aus.

oh? da ist wo noch nen fehler drin ; )
-
Nexus schrieb:
Simon2 schrieb:
Oder musst das einfach mal gesagt werden ?

Wohl am ehesten das.

Das "normale Mensch" könnte falsch verstanden werden, da hast du Recht. Ich wollte nur darauf hinweisen, dass man gerade so gut im Debug-Modus auf Out-Of-Ranges prüfen kann.
Ach so!!
Danke,
Simon2.