Benutzen einer deque...



  • Richtig erkannt - nur wo hast du in deinem Programm Schritt 3 eingebaut?

    (der Destruktor der deque löscht nur die elemente selber, aber nicht den Speicherbereich, auf den sie zeigen - dafür bist du zuständig)



  • das habe ich im destruktor meiner form, in der das ganze liegt - habe ich im Posting aus Gründen der Vereinfachung nicht aufgeführt.

    void FrameList::cleanUp(){
    	for(int i=0;i<(int)m_picFrames.size();i++){
    		PicFrame* pcfr = m_picFrames.at(i);
    		delete pcfr;
    	}
    }
    

    EDIT: Es ist zu früh. Ewiges probieren, aber ich habe nicht gemerkt, dass das cleanup auskommentiert war 😑

    Danke, wenigstens hat mich das Posting drauf gebracht!



  • Hast du sonst noch irgendwo new? Vielleicht in PicFrame selbst?



  • Das ist aber nicht der Destruktor (der Destruktor heißt "FrameList::~Framelist()") 😉 Bist du sicher, daß dein Programm dort überhaupt reingeht?



  • siehe oben 😉

    EDIT: Es ist zu früh. Ewiges probieren, aber ich habe nicht gemerkt, dass das cleanup auskommentiert war 😑

    nein, das ist natürlich nicht der Destruktor. Das ist die Funktion, die im Destruktor der Framelist und dem Destruktor der Form aufgerufen wird (mittlerweile) 🙂



  • Hmm, jetzt habe ich ein anderes Problem mit der deque.

    ich liste also meine Dateien auf

    for(int i=0;i<filecount;i++){
    		CString path = m_picPathNames.at(i);
    		PicFrame* pcfr = new PicFrame(path);
    		m_picFrames.push_back(pcfr);
    
    		std::ostringstream oss;
    		oss << "Pfad hinzu: " << m_picFrames.back()->getPathName();
    		writeDebug(oss);
    	}
    

    in meinem Debugfenster (writeDebug schreibt dort heraus) erscheint:

    Pfad hinzu: C:\Temp\ive10000226.tiff
    Pfad hinzu: C:\Temp\ive10000227.tiff
    Pfad hinzu: C:\Temp\ive10000228.tiff
    Pfad hinzu: C:\Temp\ive10000229.tiff
    (...)
    

    ich lese einen Frame aus:

    PicFrame* pcfr = FrameList::getPicFrameAt(146);
    	std::ostringstream oss;
    	oss << "Frame: " << pcfr->getPathName();
    	writeDebug(oss);
    

    getPicFrameAt(int i):

    PicFrame* FrameList::getPicFrameAt(int i){
    
    	std::ostringstream oss;
    	oss << "getFrameAt: " << i << " Framecount: " << filecount;
    	writeDebug(oss);
    
    	if(!(i >= filecount) && (!i<0))){
    		oss.clear();
    		oss << "Return: " << m_picFrames.at(i)->getPathName();
    		writeDebug(oss);
    		return m_picFrames.at(i);
    	}
    	else 
    		return m_picFrames.back();	
    }
    

    Die Ausgabe in meinem Debugfenster:

    getFrameAt: 146 Framecount: 226
    Return: C:\Temp\ive10000451.tiff
    

    ich bekomme immer die Datei C:\Temp\ive10000451.tiff zurück..

    wenn das jetzt auch so einfach ist, dann lasse ich mich hier nur noch unter anderem Namen blicken 😞

    EDIT: mit debuggen habe ich jetzt herausgefunden, dass nach jedem hinzufügen eines neuen objektes die pointer offensichtlich alle auf dasselbe objekt zeigen.
    sobald ich ein neues hinzugefügt habe, bekomme ich mit getFrameAt(int i) nur noch das letzte objekt, egal welchen index ich angebe..



  • Hat überhaupt jedes PicFrame-Objekt einen eigenen CString mit dem jeweiligen Pfadnamen? Oder speicherst du dort lediglich eine Referenz/Zeiger auf den Parameter, den du im Konstruktor bekommen hast?

    (die Ausgabe deutet auf letzteres hin)



  • anscheinend hast du recht.

    ich hatte in meiner PicFrame.cpp die variable PathName deklariert. Jetzt habe ich sie in die PicFrame.h ausgelagert, und es geht. Kannst Du mir das erklären?



  • Wenn du eine globale Variable "PathName" hast, kannst du dort wieviele Dateinamen unterbringen? (richtig - die Antwort lautet "genau einen")

    Korrekterweise gehört die Variable PathName in die Deklaration der PicFrame-Klasse, dann gilt sie als Member der Klasse und jedes PicFrame bekommt eine eigene Version davon, in der der jeweils eigene Dateiname eingetragen werden kann:

    class PicFrame
    {
    public:
      PicFrame(const CString& name) : m_path(name) {}
      ...
    private:
      CString m_path;
      ...
    };
    


  • aaah okay, danke!


Anmelden zum Antworten