[c++ - Dynamische Speicherverwaltung] - Allgemeine Fragen
-
Hallo Community,
setze mich gerade mit c++ und der dynamischen Speicherverwaltung auseinander.
Folgendes:
Ich erstelle zur Laufzeit einen INTEGER Array:
OneClass::OneClass(int _randomN) { digits = new int[4]; int faktor=1000; for(int i=0; i < 4; i++) { digits[i] = i; } delete[] digits; //Muss ich den Pointer hier schon freigeben? }Wenn ich jetzt in meinen weiteren Funktionen auf das Array zugreifen möchte, kommt eine Compiler Meldung, dass es Zugriffsverletzung bei der Adresse XXYYYZZ gab.
so sieht mein überladener operator dann aus:
OneClass::operator int(){ int number = 0, factor = 1; for( int i = 3; i >= 0; i-- ) { number += digits[ i ] * factor; // Hier kommt es zur Zugriffsverletzung, was könnte der Fehler sein? factor *= 10; } return number; }noch eine frage, wird der operator() immer impilzit aufgerufen?
zb:
OneClass computerNumber; cout << computer Number << endl;Vielen Dank
-
Nur zur Sicherheit: Du machst das nur um mal zu sehen wie das ginge, nicht weil du nicht weißt, dass es alles was man für dynamische Speicherverwaltung braucht fertig (und in der Regel besser) in der Standardbibliothek gibt?
Ich spekuliere mal auf den typischen Anfängerfehler: Regel der großen Drei verletzt.
Ein weiteres gutes Google-Stichwort neben der "Regel der großen Drei" ist "RAII".
edit: Ach nein. Du gibst den Speicher doch schon im Konstruktor wieder frei! Wie soll das denn funktionieren? Ist doch klar, dass das nicht geht. Vielleicht erst einmal noch Grundlagen zu Klassen, Konstruktoren und Lebenszeit von Objekten vertiefen, sonst verstehst du die Treffer zu den obigen Stichpunkten gar nicht richtig.
-
Eigentlich ist es doch gar nicht so schwer. Wenn du im Konstruktor dein Array wieder löscht, kannst du wohl später nicht mehr darauf zugreifen. Richtigerweise müsstest du es im Destruktor löschen.
Ansonsten gibts bessere Alternativen in der STL, die da wären std::array und std::vector.
-
WoW, wie schnell ich ne Antwort drauf bekomme. Danke
Also, da es mehr um das didaktische geht, sollen wir laut Aufgabenstellung dass mit der Dynamischen Speicherverwaltung machen. In der Aufgabenstellung ist ebenfalls vermerkt, dass es auch anders geht.
-
so,
der Fehler mal visualisiert.
Aufruf:
main.cppFehler:
-
Warum kompliziert wenn es auch einfach geht?
Falls es immer nur 4 Elemente sind, geht auch
class dings { ... int bums[4]; ... };oder
#include <array> ... class dings { ... std::array<int,4> bums; ... };und sonst
#include <vector> ... class dings { ... std::vector<int> bums; // größe kann sich auch zur Laufzeit entscheiden oder ändern ... };Kein new und kein delete in Sicht.
-
krümelkacker schrieb:
Warum kompliziert wenn es auch einfach geht?
Weil er das offensichtlich lernen will, wie er schreibt. Finde ich auch nichts daran auszusetzen, solange man das wirklich nur zum Lernen macht.
Was allerdings etwas sinnlos ist: Ihm wurde jetzt 2 mal gesagt er solle das Zeug im Destruktor freigeben, aber durchgelesen hat er sich das scheinbar nicht.