Detected memory leaks!



  • Hallo @all,

    Ich habe folgendes Problem. Bei meiner Dialog-Based Anwendung füge ich verschiedene STATIC-Textfelder ein und das paarweise, das eine mit der Wertbeschreibung und immer gleicher ID 'IDC_STATIC'. Das jeweils andere erhält eine Individuelle ID z.B.: 'IDC_FREQ'.

    Den Elementen mit eindeutiger ID verpasse ich eine CString-Variable über den Klassen-Assi, damit ich diese Elemente einfach mit UpdateData(..) aktuallisieren kann. Initialisiert werden die dann in OnInitDialog.

    Nun das Problem:
    Ich habe zunächst zwei solche Paare angelegt. Wenn ich die Anwendung starte und über das 'X' schließe - kein Problem.
    Dannach habe ich ein drittes Paar hinzugefügt, beim schließen über 'X' kamm dann die Meldung: 'Detected memory leaks!' mit dem Hinweis auf eine Zeile in 'strcore.cpp'. (es betraf auch das zuletzt hinzugefügte Object - hab ich an der Initialisierung erkannt).
    4.Paar keine Probleme
    5.Paar wieder das Problem mit dem Letzten Object.

    Was ist da los? Ich lege doch jedes Object absolut nach dem gleichen Prinzip an. was kann da passiert sein?

    Ziemlich lange Fehlerbeschreibung 😞
    Wer sich das alles durchgelesen hat und eine Idee hat - Bitte posten!

    Danke und Gruß mathi

    [ Dieser Beitrag wurde am 19.08.2002 um 12:25 Uhr von mathi editiert. ]



  • Wie legst Du die Paare an (Quellcodeauszug)?

    Wie sieht der Konstruktor vom Dialog aus, wie der Destruktor? Wie OnInitDialog?

    Bei Deinen Codeauszügen ist nur der Teil wichtig, der sich auf die Strings bezieht.

    Ich vermute, daß Du beim Stringhandling irgendwelche Strings nicht mehr freigibst... irgendein new ohne delete?



  • Mit dem Quellcode wird das schwirig, weil ich ja eigentlich alles mit dem Klassen-Assistenten bzw. dem Dialogeditor anlege.

    Bis auf die Initialisierung, die schreibe ich in OnInitDialog.
    Also ich fang mal an:

    Decleration:

    // Dialog Data
        //{{AFX_DATA(CDS_TestDlg)
        enum { IDD = IDD_DS_TEST_DIALOG };
        ...
        CString m_sMonOutWaveFreq;
        ...
        CString m_sMonOutZielFreq;
        CString m_sMonOutCurrFreq;
        CString m_sMonOutWaveBpm;
        CString m_sMonOutStepPerM;
        //}}AFX_DATA
    

    Der Constructor:

    //{{AFX_DATA_INIT(CDS_TestDlg)
        ...
        m_sMonOutWaveFreq = _T("");
        ...
        m_sMonOutZielFreq = _T("");
        m_sMonOutCurrFreq = _T("");
        m_sMonOutWaveBpm = _T("");
        m_sMonOutStepPerM = _T("");
        //}}AFX_DATA_INIT
    

    DoDataExchange:

    //{{AFX_DATA_MAP(CDS_TestDlg)
        ...
        DDX_Text(pDX, IDC_MONOUTWAVEFREQ, m_sMonOutWaveFreq);
        ...
        DDX_Text(pDX, IDC_MONOUTZIELFREQ, m_sMonOutZielFreq);
        DDX_Text(pDX, IDC_MONOUTCURRFREQ, m_sMonOutCurrFreq);
        DDX_Text(pDX, IDC_MONOUTWAVEBPM, m_sMonOutWaveBpm);
        DDX_Text(pDX, IDC_MONOUTSTEPPERM, m_sMonOutStepPerM);
        //}}AFX_DATA_MAP
    

    Und jetzt noch OnInitDialog:

    ...
    m_sMonOutWaveFreq = "1--";
    m_sMonOutZielFreq = "2--";
    m_sMonOutCurrFreq = "3--";
    m_sMonOutStepPerM = "4--";
    m_sMonOutWaveBpm.Format("%0.2f", m_dBpmOfWave);
    ...
    

    So und dann gibt es da noch 'ne Funktion in der ich die Werte aktualliesiere und UpdateData(..) aufrufe, aber die wird bei dem Szenario Start - 'X' nicht aufgerufen.

    So in diesem Fall bekomme ich die Fehlermeldung:
    Detected memory leaks!
    Dumping objects ->
    strcore.cpp(118) : {83} normal block at 0x008453B0, 16 bytes long.
    Data: < 4-- > 01 00 00 00 03 00 00 00 03 00 00 00 34 2D 2D 00
    Object dump complete.

    Also der Fehler scheint am 4. String-Object zu liegen. Wenn ich die Initialisierung dieses Strings in OnInitDialog auskommentiere, tritt der Fehler nicht auf 😕 Ich weise doch nur einen neuen String zu, was kann da schief gehen?

    [ Dieser Beitrag wurde am 19.08.2002 um 14:04 Uhr von mathi editiert. ]



  • Verwendest Du inkrementelles Linken? Hast Du mit Deinem Projekt mal einen "Alles neu erstellen" gemacht, tritt der Fehler dann noch auf?

    Beim inkrementellen Linken hat der VC manchmal Probleme und schiebt Variablen übereinander.

    Rein vom Code her sollten keine Löcher auftreten, da Du ja direkt mit Objekten und nicht mit Zeigern arbeitest.



  • Verwendest Du inkrementelles Linken?
    Hmm, also wenn du damit meinst, nur das compilieren was geändert wurde und dann Linken... Ja (geht halt schneller).

    Hast Du mit Deinem Projekt mal einen "Alles neu erstellen" gemacht...?
    Kann ich jetzt nicht genau sagen ob ich's hier gemacht habe, aber für gewöhnlich ist das das erste, was ich bei nicht sofort nachvollziehbaren Fehlern mache. Werd ich aber morgen mal gleich am Backup-Projekt prüfen, denn im aktuellen Project hab ich jetzt 6 CString-Objekte nach gleichem Prinzip und der Fehler ist verschwunden. 😕

    Danke für die Mühe und Gruß mathi

    [ Dieser Beitrag wurde am 19.08.2002 um 22:01 Uhr von mathi editiert. ]



  • Hallo,

    Tja, also 'Rebuild All' hat das Problem beseitigt. Danke nochmal für den Hinweis.
    Das merkwürdige, direkt danach habe ich noch eine Variable hinzugefügt -> inkrementelles Linken -> Kein Problem. Danach noch eine Variable -> inkrementelles Linken -> Problem. Also nur jedes zweite Mal 😕 .

    Naja, jedenfalls hat dann 'Rebuild All' das Problem beseitigt.

    Danke und Gruß mathi


Anmelden zum Antworten