Trotz "new" wird der Speicher wieder freigegeben ?!



  • Danke für eure Antworten!

    Das bei "entryset" nur eine lokale Kopie verändere macht keinen Sinn. Ich akquiriere ja extra Speicher über einen Pointer, damit der Zugriff zu jeder Zeit und nicht lokal möglich ist.

    Bitte, ich bin noch am lernen, sag mir was du an meinem Programmierstil auszusetzen hast?

    @osdt: Auf die Idee war ich auch schon gekommen, aber aus irgendeinem Grund hatte das nicht funktioniert. Ich Probiere es dennoch nochmal und poste dann die Ergebnisse 🙂



  • ThenN schrieb:

    Bitte, ich bin noch am lernen, sag mir was du an meinem Programmierstil auszusetzen hast?

    Benutze kein new oder delete. Das sind nur unnötige Fehlerquellen. Sieh dir die STL an, die hat für allerlei Standardprobleme gute Fertiglösungen. Benutze keine Casts. Casts sind dafür da, dass der Compiler Programmierfehler ignoriert. Als Anfänger weißt du es nicht besser als der Compiler und solltest stattdessen auf ihn hören.



  • Zum Programmierstil: Das ist C mit C++-Casts und new. Wenn der Code überall so ist, sollte er durch ersetzen der Casts mit C-Casts und new und delete durch malloc und free fehlerfrei durch einen C-Compiler laufen...

    Beispiel:

    typedef struct hashEntry //...
    

    Wenn man in C ein struct definiert, muss man überall wo man es verwendet struct davor schreiben. Deshalb wird typedef verwendet, dieser Typ gilt dann für den Compiler als struct STRUCTNAME. In C++ ist das nicht mehr nötig, man kann einfach

    struct hastEntry
    {
    //...
    }
    

    schreiben.

    2. Beispiel:

    void InitializeHTable(hTable * table) // ...
    

    C++ ist (unter anderem) objektorientiert. Funktionen, die auf Objektinstanzen (also einer Variable des Typs hTable) arbeiten, werden hier üblicherweise als Methoden geschrieben anstatt in einer freien Funktion. Das sieht aus, als ob versucht wird Objektorientierung ohne Sprachunterstützung zu implementieren (wie in C), dabei ist C++ schon objektorientiert.



  • ThenN schrieb:

    void InitializeHTable(hTable * table) { // table->entry ist ein Zeiger auf ein Zeiger-array, ... blah
    	hEntry * entryset = new hEntry [dimLUT]; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    	for (int i=0; i<dimLUT; i++) {
    		entryset[i].value = 0;
    		entryset[i].nextTable = 0;
    	}
    	table->entry = &entryset;                // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    	(*table->entry)[10].value = reinterpret_cast<int *>(Dataset); //ist nur nen test um zu gucken ob wirklich alles weg ist oder nur die Nullponiter verschwunden sind...
    return;
    }
    

    entryset ist eine lokale Variable. Klar, diese Variable ist ein Zeiger, und dieser Zeiger zeigt auf etwas was nicht lokal ist.
    Der Zeiger selbst ist aber dennoch lokal.
    Und in der zweiten markierten Zeile übergibst du nun die ADRESSE DES ZEIGERS. Also nicht die Adresse die IN dem Zeiger steht, sondern die Adresse der Zeigervariable selbst. Die ja, wie schon erwähnt, lokal ist.
    D.h. du speicherst da die Adresse einer lokalen Variable rein, und willst dann darauf zugreifen nachdem die Funktion bereits verlassen wurde.
    Das geht so nicht.

    => Nochmal Grundlagen Zeiger durcharbeiten.



  • Also was den Programmierstil angeht, hätte ich vllt noch den Hintergrund zu dem Programm erwähnen sollen.

    Und zwar bin ich eigentlich C und Java Programmierer, und das Programm ist eine Hausaufgabe (bin Student) und sollte extra in C++ gefertigt werden, OHNE bibliotheksfunktionen, außer Konsolenein- und Ausgabe. (cin / cout).

    Und da malloc Bibliotheksfunktionalität ist, war ich gezwungen new und delete zu nutzen. Auch ist das mein allererstes C++ Programm, deshalb habe ich auch C++ noch gar nicht verstanden. OOP ist mir ja nichts neues, aber das schon wieder alles ein anderes Zeichen ist und anders heißt ist mir so auf die Nerven gegangen das ich das so gut es ging in meinem geliebten C durchgezogen habe 😃

    Ganz ehrlich: Namespaces, überladenes shift (<<) und der :: Operator. WTF?

    Was den lokalen Zeiger angeht: Jetzt habe ichs verstanden. Da wäre ich NIE drauf gekommen. Für mich war dann der Zeiger damit auch global. Das erklärt auch warum alles mehr oder weniger funktioniert hatte, als ich entryset "globalisiert" habe... Da hats mir dann aber auch immer bei jedem new die Adresse vom Zeiger überschrieben ...

    Vielen Dank nochmal, ich werde dann wohl nochmal die Schulbank drücken müssen 😃



  • ThenN schrieb:

    Und zwar bin ich eigentlich C und Java Programmierer, und das Programm ist eine Hausaufgabe (bin Student) und sollte extra in C++ gefertigt werden, OHNE bibliotheksfunktionen, außer Konsolenein- und Ausgabe. (cin / cout).

    Arme Welt, arme Unis, arme Studenten...

    Und da malloc Bibliotheksfunktionalität ist,

    Nur als Tipp für später: malloc ist viel schlimmer als new und delete!



  • Arme Welt, arme Unis, arme Studenten...

    Was meinst du damit?



  • ThenN schrieb:

    Arme Welt, arme Unis, arme Studenten...

    Was meinst du damit?

    Er wollte ohne Kenntnis des Kontextes mal überheblich urteilen.
    Wärst du an der Volkshochschule und würdest einen Programmierer-Abendkurs belegen,
    hätte er ja Recht.
    So kann man zu der Aufgabenstellung erstmal gar nix sagen.



  • Ja macht Sinn was du sagst.

    Was er einfach nicht bedenkt, ist, das im 2. Semester davon ausgegangen wird, dass totale Anfänger in den Unis sitzen. Daher heißt die Vorlesung in dessen Rahmen die Hausaufgabe ist, auch "Datenstrukturen", davor gabs "Algorithmen und Programmierung". Der totale Scheiss eigentlich, aber eben gedacht um in die Programmierung einzuführen.

    Da es sich jedoch um ein STUDIUM handelt, geht es nicht darum, effizienten Code zu entwickeln, sondern die Theorie dahinter zu verstehen. Daher auch keine Bibliotheken, damit man gezwungen ist, sich selbst Gedanken zu machen.
    Der Rest ergibt sich dann im nachhinein von Alleine. (Die anderen Studenten brechen dann eh das Studium ab und machen wahrscheinlich eine Ausbildung.)

    Übrigens habe ich den Code mit euren Anmerkungen nochmal überdacht, und "entry" nur als "hEntry * entry" zu definieren hats dann gebracht, der Fehler lag danach noch Anderswo an einem Denkfehler 😃



  • ThenN schrieb:

    Der Rest ergibt sich dann im nachhinein von Alleine. (Die anderen Studenten brechen dann eh das Studium ab und machen wahrscheinlich eine Ausbildung.)

    Schön wär's, ja.
    Is aber eher so dass die Leute aussteigen die's nicht schaffen sich sinnlosen Müll für ne Prüfung anzulernen. Und die die durchkommen interessieren sich oft gar nicht oder nur wenig für das eigentliche Thema - die wollen bloss nen Abschluss haben, damit sie nachher dann "wichtig" sind.
    Kann man natürlich net verallgemeinern, aber viel zu oft is es halt so.



  • Ja stimmt eigentlich, ich sehe du scheinst aus Erfahrung zu sprechen! (Keine Ironie!).

    Ich wollte eher ein ideales Bild darstellen, bzw so wie ich Studium auch auffasse. Nur leider muss ich dir dahingehend recht geben, das die meisten nur wichtig sein wollen (Siehe die vielen Threads im Internet: "Darf man als M.Sc. Auch Dr. oder Dr.-Ing. schreiben?"), das sagt ja schon alles und eben heiden Geld verdienen wollen ... (Mit Personalverantwortung sind ja schon um die 100k drin...)

    Aber was willst du machen? In einer schriftlichen Prüfung hat der Prof keine Möglichkeit zu prüfen ob jemand es wirklich "verstanden" hat. Zumal bei mir an der Uni auch jeder der ein Stück weiter hinten sitzt ohne Ende spicken kann.

    Kann man nur hoffen das solche Vollpfosten in der Wirtschaft nicht auch noch durchkommen und haufen Geld in den Arsch geschoben bekommen, obwohl sie keine Ahnung von irgendwas haben ...

    OH ... warte mal ... 😃


Anmelden zum Antworten