Forum: PC-Programmierung Konstruktor/Destruktor (bei dynamischer Speicherreservierung)


von trudi (Gast)


Lesenswert?

Hallo ich habe eine Frage zu einem Konstruktor bzw. zum Destruktor.

Kessel ist mein Class.


Reicht es  wenn ich den Destruktor so wie unten schreibe oder muss ich 
das anderst programmieren da ich ja im Konstruktor den Speicher für 
"Name"  dynamisch anlege

•
1
Kessel(char*Name,int X, int Y, double Inhalt, double Temperatur)
2
        { 
3
        Kessel::Name = new char[strlen(Name)+1];                                    // Name wird in neu reservierten Speicherbreich kopiert...
4
        strcpy(Kessel::Name, Name);   
5
        }
6
       
7
       
8
~Kessel ()

grüße Trudi

von manni (Gast)


Lesenswert?

In diesem Fall musst Du den Speicher - spätestens im Dekonstruktor - 
selbst wieder freigeben, sonst entsteht ein Speicherleck. D.h., der 
Speicher würde erst beim Beenden des Prozesses freigegeben. Allerdings 
muss man noch weitere Dinge beachten - insbesondere beim Kopieren von 
Objekten des Typs "Kessel".

Generell: Verwende besser die C++-String-Klassen. Und wenn man die 
Grundlagen des manuellen Speicherhandlings verstanden hat, sollte man 
sich die Smart-Pointer-Klassen ansehen.

BTW: Einen leeren Dekonstruktor müsstest Du nicht explizit 
hinschreiben, er wird automatisch vom Compiler generiert.

von Karl H. (kbuchegg)


Lesenswert?

trudi schrieb:

> das anderst programmieren da ich ja im Konstruktor den Speicher für
> "Name"  dynamisch anlege

Grundregel:
Für alles, was du im Programm mittels 'new' anlegst, bist auch du 
verantwortlich, dass es ein zugehöriges 'delete' gibt. Und zwar nur ein 
einziges pro Pointer-Wert!

PS: Achtung.
Du verwendest ein 'new []'. Also musst du auch das zugehörige 'delete 
[]' benutzen.

: Bearbeitet durch User
von Rolf Magnus (Gast)


Lesenswert?

Und sehr wichtig: Die "Rule of Three" beachten:
Wenn du einen Destruktor, einen Kopierkonstruktor oder einen 
Zuweisungsoperator brauchst, dann mußt du dich immer um alle drei 
kümmern.
Aber wie manni schon schrieb, wäre hier std::string das Mittel der Wahl, 
um sich gar nicht erst manuell um Speicher kümmern zu müssen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.