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

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

1

14.10.2006, 10:52

new / delete in Klassen

Irgendwie krieg ich das nicht ganz raus ... Da frag ich doch mal lieber nach ^^

Wenn ich einen Zeiger auf eine Klasse mit new erstelle und innerhalb dieser Klasse eine Membervariable auch mit new belege, dann wird wenn ich delete[] auf den Pointer der Klasse anwende, der Speicher der Membervariablen nicht mit freigegeben.

Hoffe das ist verständlich und korrekt? Oder doch falsch? xD

Anonymous

unregistriert

2

14.10.2006, 11:02

C-/C++-Quelltext

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
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>

class inner_class
{
public:
    inner_class (void)
    {
        std::cout << "inner_class##__constructor" << std::endl;
    }
    ~inner_class (void)
    {
        std::cout << "inner_class##__destructor" << std::endl;
    }
    unsigned long foobar (void)
    {
        std::cout << "inner_class##foobar" << std::endl;

        return 0;
    }
}

class outer_class
{
public:
    outer_class (void) : inner_class_ (new inner_class ())
    {
        std::cout << "outer_class##__constructor" << std::endl;
    }
    ~outer_class (void)
    {
        std::cout << "outer_class##__destructor" << std::endl;

        delete inner_class_;
    }
    unsigned long foobar (void)
    {
        std::cout << "outer_class##foobar" << std::endl;

        return (inner_class_->foobar ());
    }

private:
    inner_class inner_class_;
}

int main (void)
{
    outer_class test = new outer_class;

    test->foobar ();

    delete test;

    return 0;
}

Learning by doing.

Entferne bei outer_class mal das delete oder verschieb es nach oben, damit Du ein Gefühl darin bekommst.

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

3

14.10.2006, 12:28

Man kann das auch so definieren. Jede Resource, die man anfordert, muss man auch wieder freigeben. Mit "new" fordert man jeweils eine Resource an. Wenn man also zwei mal "new" benutzt, hat man zwei Resourcen angefordert und man muss auch beide wieder freigeben.

Wie das zueinander gekapselt ist, ist dabei komplett egal.

Oder in anderen Worten: ja, das ist richtig so beschrieben. Aber mach spiel wirklich mal mit unsigned longs code rum, das kann nicht schaden. ;)

Gruss,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

14.10.2006, 12:37

Zitat von »"unsigned long"«

C-/C++-Quelltext

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
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>

class inner_class
{
public:
    inner_class (void)
    {
        std::cout << "inner_class##__constructor" << std::endl;
    }
    ~inner_class (void)
    {
        std::cout << "inner_class##__destructor" << std::endl;
    }
    unsigned long foobar (void)
    {
        std::cout << "inner_class##foobar" << std::endl;

        return 0;
    }
}

class outer_class
{
public:
    outer_class (void) : inner_class_ (new inner_class ())
    {
        std::cout << "outer_class##__constructor" << std::endl;
    }
    ~outer_class (void)
    {
        std::cout << "outer_class##__destructor" << std::endl;

        delete inner_class_;
    }
    unsigned long foobar (void)
    {
        std::cout << "outer_class##foobar" << std::endl;

        return (inner_class_->foobar ());
    }

private:
    inner_class inner_class_;
}

int main (void)
{
    outer_class test = new outer_class;

    test->foobar ();

    delete test;

    return 0;
}

Learning by doing.

Entferne bei outer_class mal das delete oder verschieb es nach oben, damit Du ein Gefühl darin bekommst.


Und wenn das Beispiel jetzt noch funktionieren würde...

grüße
@D13_Dreinig

Anonymous

unregistriert

5

14.10.2006, 12:43

David_pb
Irgendwie habe ich das Gefühl das es immer Leute gibt, die gerne funktionierenden Code immer tief zwischen die Arschbacken gedrückt bekommen wollen, nicht wahr David_pb?

Das Gurke ist sicherlich so Schlau und sieht, das dies nur Psoidocode ist und das er diese kleinen Syntaxfehler direkt erkennt. Dadurch lernt er ja!

Ich finde es nur so bedauerlich, das Du auf diese Idee irgendwie nicht gekommen bist, sondern Dich lieber nach vorne beugst.

Denk mal drüber nach.

Anonymous

unregistriert

6

14.10.2006, 12:44

Es gibt Leute die halten sich für ganz toll, aber denken nicht nach.

EDIT @ unsigned long: *zustimm*

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

14.10.2006, 12:49

Zitat von »"unsigned long"«

David_pb
Irgendwie habe ich das Gefühl das es immer Leute gibt, die gerne funktionierenden Code immer tief zwischen die Arschbacken gedrückt bekommen wollen, nicht wahr David_pb?

Das Gurke ist sicherlich so Schlau und sieht, das dies nur Psoidocode ist und das er diese kleinen Syntaxfehler direkt erkennt. Dadurch lernt er ja!

Ich finde es nur so bedauerlich, das Du auf diese Idee irgendwie nicht gekommen bist, sondern Dich lieber nach vorne beugst.

Denk mal drüber nach.


Hachje... Pseudocode, zwei fehlende Semikola und zwei fehlende Sternchen, das macht Pseudocode aus...
Und aus Erfahrung weiß ich das solche Kleinigkeiten (vorallem bei Anfängern) gleich die nächste Frage aufwerfen (warum geht das nicht).

Denk du darüber mal nach...

Zitat von »"Riddik"«


Es gibt Leute die halten sich für ganz toll, aber denken nicht nach.


Soso...

grüße
@D13_Dreinig

Anonymous

unregistriert

8

14.10.2006, 12:51

Es ist doch wirklich so, alle wollen immer gleich perfekten Code haben
und lernen dabei nichts. Warum nicht ein paar Fehler einbauen, damit
sie wenigstens ein wenig lernen und denken? Dazu kommt, dass wir
alle wissen, dass DasGurke ein sehr guter Programmierer ist.

Anonymous

unregistriert

9

14.10.2006, 12:56

David_pb
Also nimm es mir nicht übel, Du hast irgendwie eine an der Waffel! Gerade erst 7 Postings, davon sind 4 total Sinnlos. Dazu wagst Du es echt, gerade mal frisch hier zu sein und den Breiten zu markieren, respekt!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

14.10.2006, 12:57

Zitat von »"Riddick"«

Es ist doch wirklich so, alle wollen immer gleich perfekten Code haben
und lernen dabei nichts. Warum nicht ein paar Fehler einbauen, damit
sie wenigstens ein wenig lernen und denken? Dazu kommt, dass wir
alle wissen, dass DasGurke ein sehr guter Programmierer ist.


Ich weiß durchaus nicht ob er ein sehr guter Programmierer ist, dazu kommt das seine Frage nicht die eines sehr guten Programmierers war.
Und zu den Fehlern im Code... Ich kenn ul aus einem anderen Forum und dort war er stehts darauf bedacht das jede noch so bescheuerte Kleinigkeit korrekt im Code aufgeführt wird.
Und da sein Code durchaus nicht wie Pseudocode aussschaut geh ich davon aus das unsigned long (so perfekt er anderen auch anmuten mag) doch etwas vergessen hat... Mag ja vorkommen.

Zitat von »"ul"«


David_pb
Also nimm es mir nicht übel, Du hast irgendwie eine an der Waffel! Gerade erst 7 Postings, davon sind 4 total Sinnlos. Dazu wagst Du es echt, gerade mal frisch hier zu sein und den Breiten zu markieren, respekt!


Problem damit? Und lass das mit deinen ausfälligen Bemerkungen... Die bringen dich auch nicht weiter!

grüße
@D13_Dreinig

Werbeanzeige