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

29.07.2006, 21:48

Objekt verschwindet ...

Oke, folgendes Problem. Ich habe eine Managemt Klasse welche eine Liste (vom Typ std::vector, sagt man dann noch Liste?) aller Level enthält. Nicht als komplettes Level, sondern als Pointer auf ein solches. Füge ich nun ein neues Level hinzu sieht das in etwa so aus.

C-/C++-Quelltext

1
2
3
4
    // Und schreiben das neue Level über

    Level *tempLevel = new Level(tempConf->sName);
    tempLevel->openNew(tempConf);
    listLevel_.push_back(tempLevel);


Dummerweise hört das ganze Level am Ende der Funktion auf zu existieren. Der Debugger findet nur noch ne Menge BadPtr innerhalb meines "Listenvektors" wenn ich debugge.

Hab ich den new Operator nicht verstanden? Ist das einzige was mir dazu einfallen würde ...

Wenn ich irgendwoher Code posten soll dann bitte bescheidgeben, ich kann mir nicht vorstellen was ihr da sehen wollt ausser vllt den h File der Managementklasse, und da ist er ;)

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
#ifndef MANAGE_H
#define MANAGE_H

#pragma once

#include <Windows.h>
#include <string>
#include <vector>

#include "LUA.h"
#include "Level.h"

// Vorwärtsdeklaration

class LUA;

class Manage
{
    public:
        static  Manage* getInst(void);

        int     addLevelOpen(std::string sLevelName);   // Ein Level laden

        int     addLevelNew(LEVEL *tempConf);           // Ein neues Level erstellen

        
        Area*   addAreaFull(std::string sAreaName);     // Ein Gebiet laden, wird automatisch aufgerufen wenn fehlend

        int     addAreaConf(std::string sAreaName);     // Nur die Configdaten eines Gebietes parsen

        bool    checkAreaExistance(std::string sAreaName);  // Ist das Gebiet schon geladen oder nicht?


        int     listAreas(void);                        // Alle Gebiete auflisten


        LUA*    getLua(void);                       

    private:
        Manage();                                       // Konstruktor Privat =)


        bool    parseAreas(WIN32_FIND_DATAA findData);  // Teil von addAreaConf()

                                                        // Wir parsen die Config eines jeden Gebiets


    public:
        std::vector <Level*> listLevel_;
        std::vector <Area*>  listArea_;

        int iNumLevel;                              // Anzahl der geladenen Level

        int iNumArea;                               // Anzahl der geladenen Gebiete


    private:
        static Manage *instManage_;                 // Instanz der Klasse


        LUA   *instLua_;                            // Instanz unseres LUA Objekts

};

#endif

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

2

31.07.2006, 07:27

Sieht auf den ersten Blick alles richtig aus, das new ist so auch korrekt angewand.

Schau doch mal, ob nicht schon dein Manage Singleton ungültig ist... dann würdest du die Level ja ins Nirvana schreiben.

Ansonsten hilft da nur, von der Erzeugung an nachzuvollziehen, was mit so einem Level passiert, von der Erzeugung an bis zu bittren Ende, also alles im Einzelschritt durch den Debugger schieben. Wenn das Programm zu komplex ist, musst du versuchen, es in logische Teilbereiche zu splitten und diese einzeln zu testen. Solche Fehler kosten eben immer Nerven. :)

MfG,
Rainer

PS: ein std::vector erfüllt (unter anderem) alle Eigenschaften, die man von einer Liste erwartet. Ein Vektor kann aber mehr.

PPS: die Zähler für Levels und Areas brauchst du eigentlich nicht, weil ein std::vector (wie jede std::collection) selbst weiss, wieviele Elemente er (sie) enthält.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif