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

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

21

06.04.2008, 18:53

Zitat von »"Jonathan_Klein"«

Ich bin mir nicht mehr sicher, aber ich habe mal gehört, das vor einem Array im Speicher noch Zusatzinformationen stehen, die delete[] dann benutzt um das gesamte Array zu löschen.
Daher muss man Arrays immer mit delete[] freigeben und normale Objekte immer mit delete.


Richtig, bei Arrays muss ja die Anzahl der Elemente irgendwo hinterlegt werden. Diese erzeugt der Operator new[] und Speichert sie als zusätzliche Informationen irgendwohin.
@D13_Dreinig

22

06.04.2008, 18:56

Zitat von »"David_pb"«

Veruchen kannst dus. Im Grund musst du nur die globalen Funktionen operator new und operator delete überschreiben.


Oha. :? Naja ich kuck mal, was google mir dazu erzählen kann.

Zitat von »"David_pb"«


Der Operator delete[] löscht ein Zeiger auf ein Array von reservierten Elementen.


Damit kann ich grad nix anfangen ... ich weiß nicht, was du mit 'reservirten Elementen' meinst.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

23

06.04.2008, 18:59

Sowas in der Art:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
// Speicher reservieren

int **p = new int*[ 100 ]; // 100 int*


for ( int i = 0; i < 100; ++i )
  p[ i ] = new int( i ); // jedes element reservieren mit dem defaultwert 'i'


// Speicher freigeben


for ( int i = 0; i < 100; ++i )
  delete p[ i ];

delete[] p;
@D13_Dreinig

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

24

06.04.2008, 19:21

Also wenn du noch keine Lust hast dir einen Memory Manager zu schreiben kannst du auch das benutzen:

C-/C++-Quelltext

1
2
3
    #ifdef _DEBUG
     _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
    #endif 


Einfach als erstes in der main platzieren und schon hast du die Leaks. (Am besten probierst du ein wenig mit den Leaks rum, dann weisst du, wies aussieht, wenn du eins hast. ;))

25

06.04.2008, 20:47

Hmm das mit den Leaks schieb ich momentan erstmal dezent zur Seite.

Ich versuch das Problem erstmal durch umstrukturierung zu lösen / vermindern.

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
struct sprite
{
    hed_node        header;
    pal_node        palette;
    frm_node        frames; // <- sfm oder gfm ... aber WIE ?

};

struct sfm_key
{
    int32_t         frameType;      // enthält die Typsignatur des Frames. 0 = Singleframe, 1 = Groupframe.

    int32_t         frameOriginX;   // enthält einen Integerwert mit der Koordinate des Ursprungs auf der X-Achse.

    int32_t         frameOriginY;   // enthält einen Integerwert mit der Koordinate des Ursprungs auf der Y-Achse.

    int32_t         frameWidth;     // enthält die Breite des Frames in Pixel ausgelesen. Kann von der Breitenangabe des Headers abweichen.

    int32_t         frameHeight;    // enthält die Höhe des Frames in Pixel ausgelesen. Kann von der Höhenangabe des Headers abweichen.

    uint8_t         *data;          // enthält die Bytedaten des Frames. Ein Eintrag entspricht einem Pixel. Der Wert ist der Index einer Farbe in der Farbpalette.

};

struct gfm_key
{
    int32_t         frameType;      // enthält die Typsignatur des Frames. 0 = Singleframe, 1 = Groupframe.

    int32_t         numIntervall;   // enthält einen Integerwert mit der Anzahl der auszulesenden Groupframes.

    float           *intervall;     // enthält einen Floatwert, welcher die Anzeigesequenz des Groupframes bestimmt.

    int32_t         frameOriginX;   // enthält einen Integerwert mit der Koordinate des Ursprungs auf der X-Achse.

    int32_t         frameOriginY;   // enthält einen Integerwert mit der Koordinate des Ursprungs auf der Y-Achse.

    int32_t         frameWidth;     // enthält die Breite des Frames in Pixel ausgelesen. Kann von der Breitenangabe des Headers abweichen.

    int32_t         frameHeight;    // enthält die Höhe des Frames in Pixel ausgelesen. Kann von der Höhenangabe des Headers abweichen.

    uint8_t         *data;          // enthält die Bytedaten des Frames. Ein Eintrag entspricht einem Pixel. Der Wert ist der Index einer Farbe in der Farbpalette.

};


Wie bekomme ich es hin, das ich im 'sprite struct' ( Zeile 5 ) je nach fall ein 'sfm_key' oder 'gfm_key' habe ?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

26

06.04.2008, 20:56

Zusatz zum Memleak:
Wenn man dann noch will, dass angezeigt wird an welcher Stelle der Speicher allokiert wurde, fügt man in die cpp Dateien folgendes ein (darf allerdings nicht vor STL und Standardheadern stehen. Auch einige andere Header mögen das garnicht):

C-/C++-Quelltext

1
2
3
4
5
6
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
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.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

27

06.04.2008, 20:57

Da fällt mir nur Vererbung ein oder du hast einfach beide, wobei eines hald unbenutzt ist.

28

06.04.2008, 21:52

Ok. Ich denke ich bekomm das dann mit dem '_CrtSetDbgFlag' in den Griff.

Zitat von »"drakon"«

Da fällt mir nur Vererbung ein oder du hast einfach beide, wobei eines hald unbenutzt ist.


Kann man sich nicht irgendwie einen Container basteln, in dem man entweder die Adresse eines 'sfm_key' oder eines 'gfm_key' speichern kann ?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

29

06.04.2008, 21:59

Irgendwie was basteln kann man eigentlich immer. ;) Kannst auch einen irgendein void Pointer rumcasten. Aber ich denke, dass man das da viel eleganter lösen kann ohne das. Hängt hald von den Objekten ab, die du da brauchst..
Die beiden sehen ja alleine mal von Namen ja schon mal sehr ähnlich aus. Ich würde mir mal überlegen, ob das überhaupt 2 verschiedene Objekte sein müssen..

30

07.04.2008, 00:42

Stimmt eigentlich. Naja dann belasse ich es halt bei einem Objekt.

C-/C++-Quelltext

1
2
3
    #ifdef _DEBUG 
     _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); 
    #endif 


Einfach mal so in die Main geschieben, ergibt folgendes Ergebnis:

Quellcode

1
2
3
I:\Eigene Dateien\Eigene C++ Projekte\Half Life Sprite Tool\sprite_tool.cpp(10) : error C2501: '_CrtSetDbgFlag' : Fehlende Speicherklasse oder Typbezeichner
I:\Eigene Dateien\Eigene C++ Projekte\Half Life Sprite Tool\sprite_tool.cpp(10) : error C2373: '_CrtSetDbgFlag' : Neudefinition; unterschiedliche Modifizierer
        c:\program files (x86)\microsoft visual studio\vc98\include\crtdbg.h(442) : Siehe Deklaration von '_CrtSetDbgFlag'

Werbeanzeige