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

alexm

Frischling

  • »alexm« ist der Autor dieses Themas

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

1

23.06.2006, 09:39

Command Line Args führen zu Absturz

Habe folgendes interesantes Phänomen:

In meinem Programm lese ich die CommandLine-Args aus um
entsprechende Pfad/Datei angaben zu erhalten.

Beispiel:

Quellcode

1
myApp.exe c:\test_userIni.ini c:\test_userAni.ani


Nun das seltsame:
Wenn ich die Parameter im Visual Studio selbst unter den
Projektproperties (Command Arguments) eintrage, funktioniert das
Programm einwandfrei.

Wenn ich das ganze aber über ein .bat-File oder in der Konsole aufrufe,
werden zwar meine Textdateien eingelesen, jedoch erfolgt nach etwa
2 Sekunden ein Programmabsturz !???

Folgenden Code habe ich um meine ARGS zu Parsen:

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
cUserSettings* cUserSettings::CreateInstance(const LPSTR lpCmdLine)
{
    if (m_ptrInstance==NULL)
    {
        m_ptrInstance = new cUserSettings;
        
        
        // CommandLine parsen und wenn vorhanden, User-Defined

        // .ini und .ani Dateinamen übernehmen

        LPWSTR * cmdList;
        INT      nArgs;
        cmdList = CommandLineToArgvW(GetCommandLineW(), &nArgs);
        if ( cmdList != NULL )
        {
            if ( nArgs>2 )
            {
                m_ptrInstance->iniFile_filename = cmdList[1];
                m_ptrInstance->aniFile_filename = cmdList[2];
            }
            else
            {
                m_ptrInstance->iniFile_filename = L"2dcse.ini";
                m_ptrInstance->aniFile_filename = L"2dcse.ani";
            }

        }
        // Speicher der Argumentenliste freigeben

        LocalFree( cmdList );
        

        // neue Instanz retour

        return m_ptrInstance;
    }
    
    // vorhandene Instanz retour

    return m_ptrInstance;
    
}

Anonymous

unregistriert

2

23.06.2006, 18:49

Debugger. Dazu gefällt mir nicht Dein Singleton.

alexm

Frischling

  • »alexm« ist der Autor dieses Themas

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

3

23.06.2006, 22:13

:) Genauer ?
(Absturzursache gefunden - war ganz woanders im Programm und hatte mit dem CommandLine-Parser gar nix zu tun)

Anonymous

unregistriert

4

23.06.2006, 22:22

alexm
Mir gefallen diese Singletonpatterns mit new und Pointern nicht. Der Meyers ist ein Allrounder und für fast alles am Besten.

alexm

Frischling

  • »alexm« ist der Autor dieses Themas

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

5

23.06.2006, 22:27

hamma aber gestern eh diskutiert wegen den singletons ....
aber soweit ist das doch eh sicher oder meinst nicht?
wird alles brav erzeugt und brav gelöscht ...

i will nimmer alles umschreiben :( :(

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

6

24.06.2006, 08:34

Hehe,

nur weil nix da die Singletons mit "new" und "delete" nicht mag, brauchst du doch gar nix umschreiben. Du muss halt eben selber drauf achten, dass du den Speicher im Griff hast. Wenn du meinst, das ist der Fall, dann ist alles Okay. Wenn nicht, wäre es ein Leichtes, das umzustellen, weil sich nach aussen hin gar nichts ändern würde.

Wenn du unbedingt mit new/delete arbeiten willst, kannst du auch mal folgendes probieren (hab ich selbst aber noch nicht gebraucht)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <memory>

class CInst
{
  public:

  static CInst* getInstance ();
};

CInst* CInst::getInstance ()
{
  static std::auto_ptr<CInst> inst (0);

  if (0 == inst.get ())
    inst = std::auto_ptr<CInst> (new CInst);

  return inst.get ();
}


Ein Zeiger, der in einem std::auto_ptr gespeichert wird, wird automatisch dann freigegeben, wenn das std::auto_ptr Objekt vernichtet wird. Damit kann man jetzt auch nicht mehr vergessen, den Speicher freizugeben, sondern nur noch, ihn anzufordern.

Das ist sozusagen "best of both worlds." Man kann mit Zeigern arbeiten und und man vergisst trotzdem niemals, den Speicher wieder freizugeben, wenn man ihr erst einmal angefordert hat.

MfG,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

24.06.2006, 11:24

Im Falle von Singletons mit new und delete zu arbeiten, ist doch sogar umständlicher, sofern man hier überhaupt von "Umstand" sprechen kann.
Ansonsten sollte eine Umstellung doch wirklich kein Problem sein, wie rklaffehn schon sagte...

alexm

Frischling

  • »alexm« ist der Autor dieses Themas

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

8

26.06.2006, 08:32

rklaffehn:
Auto Pointer kenn ich. Diesmal wärs sogar ein ganz sinnvoller, ungefährlicher
Verwendungseinsatz dafür.
Aber - Ich lass es eh mal so wie es ist. Die wirklichen Gefahrenstellen sind
ganz wo anders in meinem Code. Aber zu denen komm ich erst (wenn ich nicht dauernd in der Sonne liegen müsste :) )

Werbeanzeige