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

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

11

01.06.2007, 23:47

Ich poste jetzt doch nochmal den Code für das Singleton.

Frage: Bleibt der Singletonpointer einer Klasse so lange bestehen bis ich ihn selber lösche oder nicht? Wenn nicht, wäre es logisch das g_pDirect3D->GetDevice() NULL wird, da dann ja hier ein neuer Pointer (g_pDirect3D eben) angelegt wird (falls sich eben der alte selber löschen kann), bei dem dann über den Konstruktor alles geNULLt wird.

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
template <class T>
class TSingleton
{
protected:
    static T *m_pSingleton;

public:
    virtual ~TSingleton()
    {
    }

    inline static T* Get()
    {
        if(!m_pSingleton)
            m_pSingleton = new T;

        return(m_pSingleton);
    }

    static void Del()
    {
        if(m_pSingleton)
        {
            delete(m_pSingleton);
            m_pSingleton = NULL;
        }
    }
};

template <class T>
T* TSingleton<T>::m_pSingleton = 0;

Sheddex

unregistriert

12

02.06.2007, 00:36

Das Erben von Heikos Singleton-Klasse kannst du dir sparen und folgendes direkt in die D3D-Klasse schreiben:

C-/C++-Quelltext

1
2
3
4
5
static CDirect3D& Instance(void)
{
   static CDirect3D Instance;
   return Instance;
}


Ist einfach viel schöner und kürzer, aber das nur so am Rande :)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

13

02.06.2007, 08:49

@spacegaier: du hast einen Debugger. Nutze ihn!
Du brauchst jetzt ja nur noch verfolgen, ab welchen Punkt dein Singleton NULL wird. Dafür kannst du ja von dem Punkt ausgehen von dem du weißt, dass das Singleton != NULL ist (aber nicht einfach drauf vertrauen, sondern auch das mit dem Debugger überprüfen!).
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

14

02.06.2007, 11:06

Der Zeiger des Singletons wird erst bei einem Aufruf von TSingleton< T >::Del() gelöscht. Sollte das aber irgendwo vorkommen zeigen sämtliche Kopien des Zeigers ins Nirvana, d.h. es werden "vagabundierende" Zeiger die bei Dereferenzierung höchst unerwünschtes Verhalten deines Programms erzeugen.
Und was macht man dagegen? Einfach keine Zeiger aus den Singleton zurückgeben sondern eine Referenz!

Achja... Constcorrektness sagt dir nichts, oder?
@D13_Dreinig

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

15

02.06.2007, 16:27

@David_pb: Nein sagt mir nix. Bin aber immer bereit was zu lernen. Hast du nähere Infos und oder Links?
Meine "vagabundierenden" Zeiger werden dank DragonFlames Hinweis eliminiert.

@Nox: Werde das ganze nun nochmal debuggen.


@DragonFlame: Danke für den Hinweis. Werde ich ändern.

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

16

02.06.2007, 17:05

Hatte das mit ZeroMemory und Klassen auch mal. Der Debugger war dann vol am spinnen und es hat ne ganze weile gedauert, bis ich drauf gekommen bin. Aber woran liegt das eig, das sich ZeroMemory nicht mit klassen verträgt?(Gehen struturen eigentlich?)


mfg,

Faule Socke

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

17

02.06.2007, 17:11

Es geht dabei nicht um "einfache" Klassen, sondern um vererbte und vererbende. Warum kann man sich, denke ich mal so, ausmalen.

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

18

02.06.2007, 17:17

Zitat von »"spacegaier"«

Der Fehler lautet jetzt übrigens so:

Zitat

Unbehandelte Ausnahme bei 0x0042b948 in BlockAttack Volume I.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.


Heißt das, dass g_pDirect3D->GetDevice() NULL zurückliefert (wegen dem 0x00000000)?


Ich glaub ich brauche hilfe beim verwenden des debuggers:

Woher weisst du, dass die Funktion g_pDirect3D->GetDevice() NULL zurückgibt? und net irgendeine andere? Und woher weisst du, dass sie überhaupt NULL zurückgibt? es könnte doch auch sein, das versucht wurde eine Methode auf einen NULL-Zeiger anzuwenden. und wie kann man solche fehlermeldungen überhaupt "interpretieren"?

PS: Woher weisst du, dass der fehler beim setzen der Render-States kommt?


Socke

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

19

02.06.2007, 17:21

Zitat von »"Das Gurke"«

Es geht dabei nicht um "einfache" Klassen, sondern um vererbte und vererbende. Warum kann man sich, denke ich mal so, ausmalen.


kann ich mir irgendwie net ausmalen. oder ich stehe gerade auf der leitung.
EDIT

Das heisst soviel wie: kannst du es mir bitte erklären?

Socke

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

20

02.06.2007, 17:30

Du musst dir nur vorstellen das du damit auch sämtlich Daten der "Mutterklassen" mit ausradierst. Stell dir vor du erbst von einer Klasse namens "Shape", welches, wieso auch immer, eine feste Farbe definiert.

Nun erbst du von Shape und nennst die Klasse "Circle". Wenn du im Konstruktor von Circle nun dieses ZeroMemory aufrufst, was wird dann wohl mit der Farbinformation, die ja ein Member von Shape ist, geschehen?

Edit:
Hab ich doch?

Werbeanzeige