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 0xbaadf005Das Programm startet ganz normal, es bricht nicht ab.
Die Ausgabe steht unten im AusgabeFenster von VSwenn ich es so mache
imageP = new RawImage();
(*imageP) = obj1; // mit dem Zuweisungsoperatorgeht 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
-
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.