new[], new, vector und Allokatoren (split von "Ich komm nicht weiter =(")



  • _matze schrieb:

    Ähm nein, er fängt gerade an und sollte ruhig auch mal ein normales Array kennenlernen. Wie traurig wäre das, wenn er ein Meister im Umgang mit std::vector wäre, und an der simplen Syntax eines Standard-Arrays scheitern würde. Zumal ich davon ausgehe, dass der Aufgabensteller ein eben solches Array gemeint hat und ein Vergleichen mit der Musterlösung (wenn es sowas da gibt) mit std::vector wohl kaum Erfolg hätte.

    Bei manchen C++-Puristen hier bekomme ich manchmal den Eindruck, dass std::vector noch vor Kontrollstrukturen gelernt werden soll. Am besten auf Seite 1 im C++-Buch, noch vor der Einleitung, oder wie? 😃

    Warum wäre das traurig? Kein Mensch braucht new[] . Niemand. Wirklich nicht. Selbst vector wird anders implementiert.
    Es ist eher traurig, dass Anfänger so früh mit manueller Speicherverwaltung verwirrt werden, anstatt ihnen die Vorzüge von Klassen(-Templates) wie std::vector zu zeigen.
    Ich habe schon verstanden, was für eine Lösung die Aufgabe suggeriert, aber die Lösung ist nicht gut. Sie erfüllt ihren Zweck, aber man lernt dadurch nichts außer der Syntax für rohe Arrays.



  • TyRoXx schrieb:

    Sie erfüllt ihren Zweck, aber man lernt dadurch nichts außer der Syntax für rohe Arrays.

    Wie GorbGorb bereits geschrieben hat, das ist ein Bestandteil von C++ und trägt zum Sprachverständnis bei. Was ist denn daran auszusetzen?



  • TyRoXx schrieb:

    Warum wäre das traurig? Kein Mensch braucht new[] . Niemand. Wirklich nicht.

    Quatsch. Man kann sich nicht immer aussuchen, was man braucht und was nicht. Wer im stillen Kämmerlein für sich alleine programmiert, kann vielleicht machen, was er will. Dann kann man auch einfach mal einige Grundlagen der Sprache ausblenden. Wer aber z.B. beruflich programmiert, muss sich an bestehende Strukturen halten. Da kann man sich dann plötzlich nicht mehr alles aussuchen. Und manchmal muss man einfach auch mit SDKs arbeiten, die verlangen, dass man per new/new[]/malloc Speicher reserviert, um bestimmte Funktionen zu nutzen. Oder man muss Funktionen umschreiben, die mit new arbeiten. Wenn dann auch noch die Zeit drückt, kann man nicht mal eben den Weltverbesserer spielen und alles umschreiben, nur weil man mit Arrays nicht vertraut ist oder sie nicht mag (aus verständlichen Gründen, zugegeben, aber das ist dann ziemlich egal).

    TyRoXx schrieb:

    Selbst vector wird anders implementiert.

    Wie denn, mit malloc? 😃 😉



  • TyRoXx schrieb:

    aber man lernt dadurch nichts außer der Syntax für rohe Arrays.

    Witzig. Du suggerierst irgendwie, dass man nichts lernt. Und im gleichen Satz erklärst du, was man dabei lernt. 😃



  • _matze schrieb:

    TyRoXx schrieb:

    aber man lernt dadurch nichts außer der Syntax für rohe Arrays.

    Witzig. Du suggerierst irgendwie, dass man nichts lernt. Und im gleichen Satz erklärst du, was man dabei lernt. 😃

    Was ist an "nichts außer" unverständlich?


  • Mod

    _matze schrieb:

    TyRoXx schrieb:

    Selbst vector wird anders implementiert.

    Wie denn, mit malloc? 😃 😉

    http://www.cplusplus.com/reference/std/memory/allocator/



  • _matze schrieb:

    Wer aber z.B. beruflich programmiert, muss sich an bestehende Strukturen halten. Da kann man sich dann plötzlich nicht mehr alles aussuchen. Und manchmal muss man einfach auch mit SDKs arbeiten, die verlangen, dass man per new/new[]/malloc Speicher reserviert, um bestimmte Funktionen zu nutzen.

    Mal ganz abgesehen davon, dass derartige SDKs in die Tonne gehören, richten sich die ersten Kapitel eines Tutorials nicht an berufliche Programmierer. Die Array-Syntax kann gerne später erwähnt werden, weil man sie kennen sollte. Aber das ist kein einfacher oder sicherer Weg, ein allgemeines Array zu erstellen. Als aufmerksamer Leser in diesem Forum solltest du auch mitbekommen haben, dass viele Anfänger mit new/[] und delete/[] überfordert sind. Solche Feinheiten sollte man lernen, wenn man die Grundlagen verstanden hat.
    Na immerhin erwähnt das Tutorial auto_ptr .



  • TyRoXx schrieb:

    Selbst vector wird anders implementiert.

    Allocators are classes that define memory models to be used by some parts of the Standard Library, and most specifically, by STL containers.

    allocator::allocate:

    In the default allocator, the block of storage is allocated using ::operator new one or more times, [...]



  • TyRoXx schrieb:

    Mal ganz abgesehen davon, dass derartige SDKs in die Tonne gehören

    Wie gesagt, das Leben ist kein Ponyhof. 😉

    TyRoXx schrieb:

    Solche Feinheiten sollte man lernen, wenn man die Grundlagen verstanden hat.

    Das sind Grundlagen, ob du es einsehen willst, oder nicht. 🙂



  • [Rewind] schrieb:

    In the default allocator, the block of storage is allocated using ::operator new one or more times, [...]

    War doch klar... 😃 Aber der gemeine Purist blendet es aus. Nein, nein, es gibt kein new in meiner Welt, oh nein... 😃


  • Mod

    [Rewind] schrieb:

    TyRoXx schrieb:

    Selbst vector wird anders implementiert.

    Allocators are classes that define memory models to be used by some parts of the Standard Library, and most specifically, by STL containers.

    allocator::allocate:

    In the default allocator, the block of storage is allocated using ::operator new one or more times, [...]

    Trotzdem, oder gerade deswegen, wird vector ohne new[] implementiert und wenn du beim Programmieren einer Containerklasse ein new, delete, malloc oder free für die gespeicherten Elemente benutzt, dann machst du etwas sehr sehr falsch. Erst der Allocatorprogrammierer braucht sich darum Gedanken zu machen.



  • _matze schrieb:

    [Rewind] schrieb:

    In the default allocator, the block of storage is allocated using ::operator new one or more times, [...]

    War doch klar... 😃 Aber der gemeine Purist blendet es aus. Nein, nein, es gibt kein new in meiner Welt, oh nein... 😃

    Bin ich hier gemeint? Ich bezog mich auf new[] , einen ganz anderen Operator. new[] wird nicht verwendet, nicht einmal von std::allocator (würde auch gar nicht funktionieren).


Anmelden zum Antworten