Bitmap loader



  • Warum, es wird doch m_Imgage.ARGB erneuert.
    Soll ich die ganze Klasse erneuern???



  • ein kopierkonstruktor (und ein selbsthergestellter zuweisungsoperator) und ein definierter destruktor sind dann nötig, wenn die klasse wirklich ein tiefe kopie braucht. das ist dann der fall, wenn das objekt über zeiger im konstruktor mit new ein objekt auf dem heap alloziert. da ein objekt für sich sorgen soll, muss es selber auch üblicherweise im destruktor dieses alloziierte stück wieder freigeben.

    wenn du eine kopie erstellst, besteht bei der flachen kopie in diesem von mir beschriebenen obigen fall dann das problem, dass der zeiger auf das im konstruktor allozierte objekt kopiert wird, und damit zwei zeiger auf dasselbe objekt bestehen.
    beim aufruf eines destruktors wird dann das objekt gelöscht, der zweite destruktoraufruf der kopie (zum beispiel) läßt das programm abstürzen, da nichts mehr auf dem heap reserviert ist.
    es ist wie siamesische zwillinge mit einem herzen.

    du musst in diesem fall, also wenn eine klasse über einen zeiger extra nochmal alloziert, für eine tiefe kopie sorgen.

    wenn du in einer methode (nicht konstruktor) allozierst, und den zeiger nicht irgendwie weitergibst, erzeugst du speicherlöcher.

    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=BigThree#Answ



  • Ja, dass ist schon klar.



  • sorry, hab dein programm noch nicht ganz durchstiegen.
    der vortrag war voreilig 🙂



  • Sind auch ne ganze menge Zeilen, auf jeden Fall will ich ne Image class erstellen (statt Membervariable), sodass ich auch TGAs, Gifs und Jpgs laden kann.



  • mach erstmal das

    ZpBmpLoader::ZpBmpLoader(void)
    {
    	m_Image.m_pARGB=NULL;
    }
    

    dein m_Image ist einfach nicht angesprungen.

    aber mir ist das alles zu gefährlich, soll man ein könner draufschaun 🙂



  • Wozu soll das gut sein???



  • alleine bei falscheingabe einer datei stürzt dein programm sonst schon ab, bei aufruf von release..

    bool ZpBmpLoader::LoadBmpFile(const char *pFileName)
    {
        FILE* pFile = fopen(pFileName, "rb");
    
        if(!pFile)
            return(false);
    

    du fragst ja in release ab auf

    if(m_Image.m_pARGB != NULL)
    

    aber wo wird der zeiger m_pARGB genullt? überseh ich das?



  • Stimmt, soloche Sachen übersieht man schnell!!!



  • und ebenso hier..

    if((m_BmpFileHeader.m_cType[0] != 'B') && (m_BmpFileHeader.m_cType[1] != 'M'))
            return(false);
    

Anmelden zum Antworten