Probleme bei CTypedPtrArray



  • Kann ich in einem Document nicht 2 Felder von folgenden Typ anlegen?

    CTypedPtrArray<CObArray,CVokabel*> myVokabelArray;
    CTypedPtrArray<CObArray,CStatistik*> myStatistikArray;
    

    Die beiden Typen sind eigentlich gleich aufgebaut. Nur scheint das zweite seine Daten nicht korrekt verwalten zu können.

    Folgenden Effekt verstehe ich nicht:
    In NewDocument rufe ich folgendes auf

    CStatistik *statTemp=new CStatistik(CTime::GetCurrentTime(),234,5);
    	myStatistikArray.Add(statTemp);
    	TRACE("statTemp: %d\n",statTemp->GetNumberOfErrors());
    	delete statTemp;
    	TRACE("%d\n",myStatistikArray.GetSize());
    	TRACE("%d\n",myStatistikArray.GetAt(0)->GetNumberOfErrors());
    

    Im Trace steht nun folgendes:
    statTemp: 5
    1
    In Statistik GetNumberofErrors: -17891602
    -17891602

    Hier noch der Constructor von CStatistik:

    CStatistik::CStatistik(const CTime wert1,const int wert2,const int wert3)
    {
    	TRACE("In Constructor: %d\n",wert2);
    	m_ctDateOfSession=wert1;
    	m_intNumberOfQuestions=wert2;
    	m_intNumberOfErrors=wert3;
    }
    

    Und die Funtion GetNumberOfErrors() in CStatistik

    int CStatistik::GetNumberOfErrors()
    {
    	TRACE("In Statistik GetNumberofErrors: %d\n",m_intNumberOfErrors);
    	return m_intNumberOfErrors;
    }
    

    Kann mir jemand nun erklären, warum beim Zugriff auf das Array die Funktion myStatistikArray.GetAt(0)->GetNumberOfErrors() die Zahl -17891602 zurück gibt und nicht 5?



  • Da du das Objekt, gleich nachdem du den Zeiger in das Array gesteckt hast, mit delete wieder zerstörst, ist der Zeiger im Array ungültig.



  • Ich dachte einem new muss ein delete folgen und ich dachte auch, dass der Zeiger hier zerstört werden kann, weil nun das Array die Sache verwaltet.
    Wann kann ich denn den Zeiger löschen?



  • ratmann schrieb:

    Ich dachte einem new muss ein delete folgen

    Soweit richtig.

    und ich dachte auch, dass der Zeiger hier zerstört werden kann, weil nun das Array die Sache verwaltet.

    delete zerstört nicht den Zeiger, sondern das Objekt, worauf er zeigt. Und das Array verwaltet nur den (jetzt ungültigen) Zeiger.

    Wann kann ich denn den Zeiger löschen?

    Wenn du das Objekt nicht mehr brauchst.

    Muss es denn CTypedPtrArray sein? Würde es std::vector nicht auch tun?


Anmelden zum Antworten