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

Dofter

Treue Seele

  • »Dofter« ist der Autor dieses Themas

Beiträge: 159

Wohnort: im wunderbaren EBERMANNSTADT

Beruf: Schüler^^

  • Private Nachricht senden

1

26.09.2008, 13:53

Problem mit release

Hallo zusammen,

beim Ausführen meiner Release-Version meines Programmes kommt es zu einem Absturz den ich nucht ganz verstehe:

C-/C++-Quelltext

1
2
3
MessageBox(NULL, "1", "a", MB_OK);
    m_vObjectEntries.clear();
    MessageBox(NULL, "2", "a", MB_OK);

Die erste Box wird angezeigt die zweite nicht mehr. In der Debugversion gibt es aber keinerlei beanstandungen.

vObjectEntries ist ein vector<SObjectEntry*> und Variable einer Klasse.

Hat jemand eine Idee was ich vergessen habe?

mfg
Dofter
"Wo kämen wir hin, wenn alle sagten, wo kämen wir hin, und keiner ginge,
um zu sehen, wohin wir kämen, wenn wir gingen"

Haxx0r

Treue Seele

Beiträge: 209

Wohnort: Da!

Beruf: Rebell mit aktivem Lebensstil

  • Private Nachricht senden

2

26.09.2008, 14:08

Ist doch klar warum nur die erste MessageBox kommt,

C-/C++-Quelltext

1
m_vObjectEntries.clear(); 
steht da im Weg, soweit kommt er nicht mehr. Zeig doch mal die Methodendeklaration/definition.

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

3

26.09.2008, 14:26

Dabei sollte eigentlich ohne weiteres nichts schiefgehen können ... Es werden durch das clear() ja nichtmal destruktoren aufgerufen. Der Vektor selber ist anscheinend auch kein pointer, also solte da auch kein zeiger ungültig sein.

Nenn doch bitte mal den Fehler, den du beim Absturz bekommst (Debugger! Nicht sowas wie "Programm musste beendet werden!").

Edit: Befindet sich diese Methode möglicherweise innerhalb eines Objekts, dass zum Aufrufzeitpunkt der Methode schon gelöscht ist? Es geht ja immerhin beim Zugriff auf eine Membervariable was schief. Funktionieren denn andere Methoden von Membervariablen oder ist es explizit das clear()?

Anonymous

unregistriert

4

26.09.2008, 15:04

Haxx0r
Nonsens.

Mordrak

1x Contest-Sieger

Beiträge: 121

Wohnort: München

Beruf: Junior IT Consultant

  • Private Nachricht senden

5

26.09.2008, 17:00

Ganz allgemein - wenn ein Programm an einer Stelle abstuerzt und die Befehle um diese Stelle herum sehen alle sauber und harmlos aus, dann verbirgt sich meist an voellig anderer Stelle ein fieser kleiner Pointerfehler, Puffer ueber-/unterlauf oder aehnliches.

Der Abstand (im Code und auch zeitlich) von wahrgenommener Absturzstelle und der Stelle mit dem Zeigerfehler kann extrem gross sein.

Gruesse,
Mordrak
What's yellow and equivalent to the axiom of choice? The Lemmon of Zorn!

Dofter

Treue Seele

  • »Dofter« ist der Autor dieses Themas

Beiträge: 159

Wohnort: im wunderbaren EBERMANNSTADT

Beruf: Schüler^^

  • Private Nachricht senden

6

26.09.2008, 19:06

Hi,
erstaml danke für die Antworten:
@Haxx0r: ich denke den inhalt dier Methode kannst du dir selber anschauen, und wenn da was schief dirn ist, dann Prost Mahlzeit ;)
@Das Gurke: Diese Methode wird bei dier Initialisierung von Direct X aufgerufen (gleich danach), die Liste ist eigentlich noch leer, jedoch funktionieren auch spätere aufrufe auf den Vektor nicht (resize und co.). Wenn ich im Konstruktor der Klasse clear Aufrufe geht es ohne beanstandung. Genauso wie im Debugmodus. dieser Fehler taucht nur im Release auf (deswegen auch die Message Boxes). Die genaue Stelle and der der Absturz erzeugt wird ist in dder Datei dbghook.c (ganz unten):

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
56
57
58
59
60
61
62
63
64
65
66
/***
*dbghook.c - Debug CRT Hook Functions
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       Allow users to override default alloc hook at link time.
*
*******************************************************************************/

#include <dbgint.h>

#ifdef _DEBUG

#include <internal.h>
#include <limits.h>
#include <mtdll.h>
#include <malloc.h>
#include <stdlib.h>

_CRT_ALLOC_HOOK _pfnAllocHook = _CrtDefaultAllocHook;

/***
*int _CrtDefaultAllocHook() - allow allocation
*
*Purpose:
*       allow allocation
*
*Entry:
*       all parameters ignored
*
*Exit:
*       returns TRUE
*
*Exceptions:
*
*******************************************************************************/
int __cdecl _CrtDefaultAllocHook(
        int nAllocType,
        void * pvData,
        size_t nSize,
        int nBlockUse,
        long lRequest,
        const unsigned char * szFileName,
        int nLine
        )
{
        return 1; /* allow all allocs/reallocs/frees */
}

#endif  /* _DEBUG */

int _debugger_hook_dummy;

#ifdef _M_IA64
#undef _CRT_DEBUGGER_HOOK
#define _CRT_DEBUGGER_HOOK __crt_debugger_hook
#endif  /* _M_IA64 */

__declspec(noinline)
void __cdecl _CRT_DEBUGGER_HOOK(int _Reserved)
{
    /* assign 0 to _debugger_hook_dummy so that the function is not folded in retail */
    (_Reserved);
    _debugger_hook_dummy = 0; // HIER BLEIBT ER STECKEN

}


mit der Warnung

Zitat

Microsoft Visual Studio C Runtime Library hat einen schwerwiegenden Fehler in Programm.exe gefunden.

Klicken Sie auf "Unterbrechen", um das Programm zu debuggen, oder auf "Weiter", um es zu beenden.


Das Objekt in dem sich die Variable befindet ist die erste Klasse die erstellt wird und die letzte die gelöscht wird. Aundere Memberwariablen funktionieren Anstandslos. Zu Testzwecken habe ich noch einen vector<int> und eine list<int> jetzt eingebaut und clear aufgerufen: Der gleiche Fehler tritt auf. Sonstige Variablen wie Int, double, float lassen Werteübergaben zu.

Wenn ich diese Zeilen auskommentiere und das Programm fortfählt ist es in einer Anderen Funktion jedoch möglich in einer Anderen Klasse einer anderen Liste Member zu adden/löschen,...

@unsigned long: Agree.
@Mordrak: zeitlich vorher passiert eigentlich "nix", es kommt auch kein Zeiger vor...


mfg
Dofter
"Wo kämen wir hin, wenn alle sagten, wo kämen wir hin, und keiner ginge,
um zu sehen, wohin wir kämen, wenn wir gingen"

Dofter

Treue Seele

  • »Dofter« ist der Autor dieses Themas

Beiträge: 159

Wohnort: im wunderbaren EBERMANNSTADT

Beruf: Schüler^^

  • Private Nachricht senden

7

26.09.2008, 19:19

Ahh ok, jetzt habe ich endlich was gefunden. Wenn ich die Zeile: ZeroMemory(this, sizeof(CMain)); auskommentiere funktionert auch alles im Release: großes "?"
"Wo kämen wir hin, wenn alle sagten, wo kämen wir hin, und keiner ginge,
um zu sehen, wohin wir kämen, wenn wir gingen"

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

8

26.09.2008, 19:31

Was passiert denn wenn du stattdessen den vector nach ZeroMemory neu initialisierst ?
"Have you tried turning it off and on again?"

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

26.09.2008, 19:35

Zitat von »"Dofter"«

Ahh ok, jetzt habe ich endlich was gefunden. Wenn ich die Zeile: ZeroMemory(this, sizeof(CMain)); auskommentiere funktionert auch alles im Release: großes "?"


Das ist etwas was man so wieso niemals tun sollte!
@D13_Dreinig

Dofter

Treue Seele

  • »Dofter« ist der Autor dieses Themas

Beiträge: 159

Wohnort: im wunderbaren EBERMANNSTADT

Beruf: Schüler^^

  • Private Nachricht senden

10

26.09.2008, 19:55

@Chase: Wenn das hier richtig ist, dann gehts nicht:
m_vObjectEntries = std::vector<SObjectEntry*>();
@David_pb: Was sollte man so nicht tun? Auskommentieren oder Fragen stellen? ;)
"Wo kämen wir hin, wenn alle sagten, wo kämen wir hin, und keiner ginge,
um zu sehen, wohin wir kämen, wenn wir gingen"

Werbeanzeige