Aufruf des Kopierkonstruktors erzeugt Zugriffsverletzung



  • in RawImage.h
    
    RawImage(const RawImage& source); // der Kopierkonstruktor
    RawImage& operator=(const RawImage& source); // der Zuweisungsoperator
    
    in RawImage.cpp
    
    RawImage::RawImage(const RawImage& source)
    {
    	//copyFrom(source);
    	//DebugF("RawImage(const RawImage& source) source.m_fileName = %s\n",source.m_fileName.c_str());
    }
    RawImage& RawImage::operator=(const RawImage& source)
    {
    	std::string filename = source.getFileName();
    	DebugF("RawImage::operator=(const RawImage& source) source.m_fileName = %s\n",filename.c_str());
    
    	copyFrom(source);
    	return *this; // als Referenz zurückgeben
    }
    

    ein Code wie dieser:

    RawImage obj1;
    RawImage* imageP;

    imageP = new RawImage(obj1); // mit Kopierkonstruktor

    erzeugt in VisualStudio9 :
    Eine Ausnahme (erste Chance) bei 0x7c97d811 in prog.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xbaadf005

    Das Programm startet ganz normal, es bricht nicht ab.
    Die Ausgabe steht unten im AusgabeFenster von VS

    wenn ich es so mache

    imageP = new RawImage();
    (*imageP) = obj1; // mit dem Zuweisungsoperator

    geht es, wobei das ja nicht Sinn der Sache sein kann

    Es ist auch völlig egal, ob im Kopierkonstruktor Code steht oder nicht,
    wobei aber das Argument normal übergeben wird und ich es, zB. zur Ausgabe des Dateinamens, benutzen kann.

    Weiß vielleicht jemand eine Lösung oder den Grund dafür ?

    Mfg

    Winnetou11


  • Administrator

    Winnetou11 schrieb:

    Weiß vielleicht jemand eine Lösung oder den Grund dafür ?

    Mit dem bisschen was du uns zeigst eher nicht. Damit man hier sinnvoll mit der Fehleranalyse starten kann, brauchen wir wohl mindestens die Membervariablen zu wissen, den vollständen Copykonstruktor und Konstruktor.

    Wahrscheinlich machst du irgendwo einen Speicherfehler. Greifst auf uninitialisierten oder bereits gelöschten Speicher zu.

    Grüssli



  • Im Konstruktor werden nur 4 double auf 0 gesetzt,
    sonst passiert nix. Der Kopierkonstruktor ist wie im Code zu sehen leer.
    Also ich habe die Zeilen - 2 Stück - auskommentiert, der Fehler tritt trotzdem auf.

    Da muss es ein Speicherfehler sein oder etwas anderes komisches.
    Nur dürfte dies nicht von dieser Klasse kommen, da sie erst nach einer lade-Methode überhaupt etwas macht und vor
    RawImage obj1;
    RawImage* imageP;

    imageP = new RawImage(obj1); // mit Kopierkonstruktor

    passiert nix weiter.

    Dachte, vielleicht hatte jemand schon ähnliches erlebt.



  • Das Problem bei einem Speicherfehler ist, dass er nicht dort her kommen muss, wo er angezeigt wird. Sprich, wenn du irgendwo einen Mist gebaut hast, dann kann der später bei einer völlig unscheinbaren Aktion ein Problem verursachen. Das ist ja das eklige an "undefined behavior". Es kann alles passieren und so etwas ähnliches ist mir auch mal passiert.


Anmelden zum Antworten