Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

koschka

Community-Fossil

  • »koschka« ist der Autor dieses Themas

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

1

01.12.2003, 07:45

Automatische Konstructoren

Hi, ich hab mal ne blöde Frage:
ich hab zwei Klassen, bietet sich einfach so an, wenn ich die zweite Klasse (die Klasse, die die andere, kleinere Klasse einbindet) lösche, müsste sich doch auch die erste Klasse löschen, oder?

Ein Codebeispiel:
(Header Datei)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Command  {
private:
    char* Name;
    UINT Parameters;
public:
    Command();
    ~Command();
                void Set(char* Name, UINT Parameters);
};

class Commandlist  {
private:
    Command*  pCommandlist;
    UINT Entries;
    UINT MaxEntries;
public:
    Commandlist(UINT MaxEntries);
    ~Commandlist();
                void AddEntry(char* Name, UINT Parameters);
};

(CPP Datei)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/**********************************/
// Konstructor
Command::Command()  {
  this->Name = NULL;
  this->Parameters = 0;
}

//Destructor
/**********************************/
Command::~Command()  {
   IS_SAFE_DELETE_ARRAY(this->Name);
}
// Set Methode
/**********************************/
void Command::Set(char* Name, UINT Parameters)  {
  IS_SAFE_DELETE_ARRAY(this->Name); 
  this->Name = new char [strlen(Name) + 1]; 
  strcpy(this->Name, Name); 
  this->Parameters = Parameters;
}

// Konstructor Commandlist
/**********************************/
Commandlist::Commandlist(UINT uiNumArgs)  {
  this->pCommandlist = new Command [uiNumArgs];

  this->Entries = 0;
  this->MaxEntries = uiNumArgs;
}

// Destructor Commandlist
/**********************************/
Commandlist::~Commandlist()  {
  IS_SAFE_DELETE_ARRAY(this->pCommandlist);
}

// Eintrag hinzufügen
/**********************************/
void Commandlist::AddEntry(char* Name, UINT Parameters)  {
  if(this->Entries >= this->MaxEntries)  { IS_ERROR_INTERNAL(); return; }

  // Eintrag um eins erhöhen für einen neuen Eintrag
  this->pCommandlist[this->Entries++].Set(Name, Parameters);
}


wenn ich jetzt also:

Commandlist CDMList;

CDMList.AddEntry("test", 1);

aufrufe, und es danach wieder terminiert wird (durch Programm Ende) müssten doch das Command Objekt ebenfalls zu dem Commandlist Objekt gelöscht werden, ohne das ein Speicherleck entsteht oder???

2

01.12.2003, 09:48

Das kommt darauf an, ob das (ich nehme mal an es ist eins) Makro IS_SAFE_DELETE_ARRAY delete [] aufruft. Dann schon!
Ein Gespenst geht um in Europa...

Anonymous

unregistriert

3

01.12.2003, 15:30

Warum machst du das so umständlich "this-><irgendwas>"?

In 'ner Memberfunktion werden Member-Funktionen automatisch von "diesem" Objekt aufgerufen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

01.12.2003, 16:20

Wahrscheinlich, um die Autovervollständigung nutzen zu können!

koschka

Community-Fossil

  • »koschka« ist der Autor dieses Themas

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

5

01.12.2003, 21:14

^^ ganau erstens deswegen und ich hab mir das so angewöhnt um die Daten einer Klasse so eindeutig angeben ein Beispiel:
(Header Datei)

Quellcode

1
2
3
4
5
6
class test  {
  char* ptext;
public:
  test(char* ptext);
  ~test();
};

(CPP Datei)

Quellcode

1
2
3
4
5
6
7
8
9
test::test(char* ptext)  {
  // Dies wäre falsch (jedenfalls würde das zu unerwarteten Ergebnissen
  // in manchen Compilern führen
  ptext = new char [strlen(ptext) + 1];

  // dies ist immer richtig
  this->ptext = new char [strlen(ptext) + 1];
...
}
[/quote]

Werbeanzeige