Speicherreservierung von sehr vielen Daten



  • Der Schnipsel an sich ist vollkommen okay - ich denke der Fehler wird nur im Zusammenhang klar.

    Zeig doch mal, wo du den Speicher für den Zeiger reservierst. Schließlich hast du die komplette Speicherlogik deines Programmes geändert. ⚠

    MFK schrieb:

    Das Prüfen vor dem delete ist übrigens unnötig.

    Ist aber sauberer. 👍



  • estartu_de schrieb:

    MFK schrieb:

    Das Prüfen vor dem delete ist übrigens unnötig.

    Ist aber sauberer. 👍

    Wieso? Ein delete bewirkt bei einem Nullzeiger nichts. Was ist an einer überflüssigen Prüfung "sauberer"?



  • http://www.c-plusplus.net/forum/viewtopic-var-t-is-114489.html
    Wenn da aber wieder was liegt, dann knallts.

    Du musst wissen, wo du Performance sparst - aber ich habe lieber ein stabiles Programm. 🙄



  • Ok, dann werde ich nun genauer ( ihr habt es nicht anders gewollt 🙂 ):

    Ich habe ein Fenster in dessen Mitte einige kleine Graphen dargestellt werden.
    Klicke ich auf einen Graphen, dann wird ein neues Fenster geöffnet, welches diesen Graphen vergrössert darstellt. Jedes neue Fenster ist ein Objekt von einer Klasse

    CGraph
    

    .
    Da ich von jedem Graphen nur ein Fenster offen haben will überprüfe ich dies anhand einer BOOL-Variable. Dann schaue ich direkt, ob schon ein Zeiger existiert, falls nicht, dann erzeuge ich ihn.

    if (m_RpmOpen == FALSE)        //Graph-Fenster schon geöffnet?
    {
        if(m_pRpm)                     //Zeiger existiert?
        {
            delete m_pRpm;
            m_pRpm = NULL;
        }
    
        m_pRpm = new CDiagram(this,"RPM",&m_RpmOpen);
        if(m_pRpm)
        {
            BOOL ret = m_pRpm->Create(IDD_DIAGRAM,this);
            if (!ret) AfxMessageBox("Error creating 'Diagram' dialog!");
            else 
            {
                m_pRpm->ShowWindow(SW_SHOW);	
                m_RpmOpen = TRUE;
            }
        }
    }
    

    Ich delete erst den Zeiger, denn wenn ich ein Fenster schliesse und es dann erneut aufrufe gibt es memory leaks!
    Das letzte Fenster wird dann im Destruktor freigegeben/gelöscht.
    😉



  • estartu_de schrieb:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-114489.html
    Wenn da aber wieder was liegt, dann knallts.

    Wenn da was liegt, dann war's kein Nullzeiger. Da hilft auch diese Prüfung nichts. Auch einen uninitialisierten Zeiger fängt sie nicht. Und da der Zeiger hinterher auf NULL gesetzt wird, ist auch die Gefahr eines doppelten delete nicht gegeben (wobei man über den Mechanismus selbst streiten kann).

    Diese Prüfung bewirkt gar nichts.



  • Doch tut sie. Wenn ich ein Fenster öffne, dann reserviere ich Speicher.
    Schliesse ich das Fenster ist der Speicher ja immer noch reserviert.
    Öffne ich wieder ein Fenster, dann reserviere ich mir noch mehr Speicher.
    Mit dieser Prüfung gebe ich den alten Speicher aber wieder frei. 🕶



  • Wie ist denn nun eigentlich der Text der Warnung?



  • Ich habe nicht gesagt, dass der Code in dem Block, den die Prüfung einschließt, nichts tut. Aber die Prüfung selbst könntest du weglassen. Wenn m_pRpm NULL ist, dann machst du ohne die Prüfung ein delete mit einem Nullzeiger (tut nichts) und setzt ihn danach auch NULL (tut auch nichts, war ja schon vorher NULL).



  • @MFK: mein Fehler, habe dich falsch verstanden.

    Die Warnung lautet:

    Warning: calling DestroyWindow in CDialog::~CDialog --
    OnDestroy or PostNcDestroy in derived class will not be called.

    😉



  • Paul_C schrieb:

    Warning: calling DestroyWindow in CDialog::~CDialog --
    OnDestroy or PostNcDestroy in derived class will not be called.

    Du solltest DestroyWindow aufrufen, bevor du delete benutzt. Achtung, dafür brauchst du die Prüfung 😉

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfcnotes_tn017.asp



  • Vielen Dank, das Problem ist nun gelöst. 😉



  • Doch noch ne Frage:
    Wo finde ich die exit codes?
    Manchmal sagt er mir

    The thread 'Win32 Thread' (0x9d4) has exited with code 1 (0x1).
    und
    The program '[2616] MeinProgramm.exe: Native' has exited with code 2 (0x2).

    manchmal aber auch mit 0x0, oder so.
    Weder bei google, noch in der Suche, noch bei msdn finde ich alle aufgelistet.
    Wonach muss ich suchen?
    😕


Anmelden zum Antworten