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

1

08.03.2015, 22:03

Fehler: BLOCK_TYPE_IS_VALID - nach aufrufen des Destruktors

Guten Abend liebes Forum,

ich habe ein Problem beim löchen bzw zerstören einer Klasse.
Doch zum Kontext: Ich arbeite an einem kleinen Menu das aus Seiten und diese jeweils aus Elementen bestehen.

Eine "Seite" wird über die Klasse GameMenu erstellt und mit den jeweiligen Elementen Initialisiert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void CGameMenu::InitMain()
{

    CMenuPage * MainMenu;
    MainMenu.InitPage(3);

    MainMenu->InitElement(1, "Starten",...);
    MainMenu->InitElement(2, "Optionen",...);
    MainMenu->InitElement(3, "Beenden",...);
    MainMenu->Set_Focus(0);

    
}


Jeh nachdem wie viele Elemente(ein Element ist nichts weiter als ein True Type Font das in ein Bild umgewandelt wird) erstellt werden, wird die größe des Arrays festgelegt:

C-/C++-Quelltext

1
2
3
4
5
void CMenuPage::InitPage(const int New_Elements)
{
    iElements = New_Elements;
    Elements = new CText[iElements];
}


Soo soweit zum Aufbau. Jetzt möchte der Benutzer jedoch das Spiel starten, somit wird die "Seite" MainMenu nicht mehr gebraucht und ich möchte diese dann gerne löschen.
Dies geschieht aus der GameMenu Klasse sobald ein paar Bedingungen erfüllt sind:

C-/C++-Quelltext

1
2
3
4
//if bla bla
{
 MainMenu.~CMenuPage();
}


Destruktor von MenuPage:

C-/C++-Quelltext

1
2
3
4
5
6
7
CMenuPage::~CMenuPage()
{
    
            delete[] Elements;
            Elements = NULL;

}


So nun erscheint jedoch der Fehler: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse (siehe Anhang)

Im Internet bin ich auf einige Lösungen gestoßen die mich jedoch nicht weitergebracht haben, ich hoffe ihr könnt mir helfen

Liebe Grüße Urprimat.
»Urprimat« hat folgendes Bild angehängt:
  • Fehler.JPG
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Urprimat« (09.03.2015, 19:38)


Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

2

08.03.2015, 22:16

Etwas OT, aber möchtest du vielleicht nicht lieber einen std::vector benutzen statt eines selbst verwalteten Arrays?
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

08.03.2015, 23:32

Warum rufst du manuell den Destruktor auf?!

4

08.03.2015, 23:38

@Legend

OT?

Ich fand die lösung mit selbst verwalteten Arrays hier ganz angenehm... bis jetzt


@David
Wird dadurch das Objekt nicht zerstört?
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

5

09.03.2015, 00:29

Der destructor wird von alleine aufgerufen, wenn das Objekt zerstört wird. Den wirst du NIEMALS selbst aufrufen müssen.
Wenn doch, hast du ein anderes Problem.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

6

09.03.2015, 01:35

Wie wird die Instanz von CMenuPage gehandhabt? Wenn es ein Pointer ist, dann kannst du einfach den deleten, dann wird das Objekt gelöscht.
Ist es eine Variable müsste es gelöscht werden, wenn du aus dem Scope rausgehst. Dann wird auch der Destruktor aufgerufen (in beiden Fällen).

7

09.03.2015, 02:42

Zitat

Im Internet bin ich auf einige Lösungen gestoßen die mich jedoch nicht weitergebracht haben
Oi?

...
Edit: falscher Inhalt.

Dennoch, wie schon geschrieben wurde: Nutze in dem Fall einfach nen vector. Ist deutlich komfortabler und sicherer hier.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »iSmokiieZz« (09.03.2015, 23:17)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

09.03.2015, 06:30

delete wird dann mit einem 0ptr aufgerufen.
Das ist völlig legal und tut gar nichts.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

9

09.03.2015, 11:16

@Legend

OT?

Ich fand die lösung mit selbst verwalteten Arrays hier ganz angenehm... bis jetzt


Off-Topic. Das wäre keine Hilfe um deinen selbst-verwalteten Array ans laufen zu bekommen, sondern gleich nen anderer Ansatz.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

10

09.03.2015, 19:44

@ birdfreeyahoo
selbst wenn ich "MainMenu" als Pointer setze und es dann mit "delete" lösche kriege ich den fehler....


ich werde es nun mit einem Vector versuchen, ich versteh nur leider nicht warum es nicht funzt. Ansich (außer die sache mit dem manuellen aufrufen des Destruktors :pillepalle: ) mache ich doch alles richtig oder nicht?
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

Werbeanzeige