copy-Konstruktor & Destruktor



  • Hallo zusammen!!

    Ich bekomme im unten dargestellten Beispiel immer einen Speicher-Error an der markierten Stelle des Destruktors! Ich hab keine Ahnung woran das liegt, da doch der Speicher, der dort gelöscht wird, eigentlich nicht im anderen Vektor steht. Ich kopiere den Inhalt des Pointers doch explizit mittels des copy-Konstruktors um, dachte ich zumindest!

    Das Problem ist: Wenn ich den Speicher nicht im Destruktor lösche, hab ich anwachsende Speicherlecks! Was muss ich da ändern, damit das ordnungsgemäß funktioniert???

    Würde mich sehr über Tips freuen! Die Datei steht unten!

    Viele Grüße,

    Tobias

    // CopyTest.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    
    // =======================================================
    // Die VEKTOR-Klasse
    // =======================================================
    
    class Vektor {
    
    public:
    
    	// Speicher allokieren
    	void Vektor::init(int n) {
    		v = new double[n];
    		for(int i=0;i<n;i++) v[i] = 0.0;
    		this->n = n;
    	}
    
    	// Konstruktor
    	Vektor::Vektor(double v, int n) {
    		init(n);
    		for(int i=0;i<n;i++) this->v[i] = v;
    	}
    
    	// Destruktor
    	Vektor::~Vektor() {
    		if( v!=NULL ) delete [] v;
    		n = 0;
    		return;
    	}
    
    	// Copy-Konstruktor
    	Vektor::Vektor(const Vektor &v) {
    		init(v.n);
    		for(int i=0;i<n;i++) this->v[i] = v.v[i];
    		return;
    	}
    
    	void Vektor::print() {
    		printf("=== Vektor:\n");
    		printf("- Dimension: %i\n",n);
    		for(int i=0;i<n;i++) printf("%i: %10.5f\n",i,v[i]);
    	}
    
    	double *v;  // Elemente
    	int n;      // # Elemente
    
    };
    
    // =======================================================
    // Hauptprogramm
    // =======================================================
    
    Vektor test() {
    	Vektor vRet = Vektor(15.0,3);
    	return vRet;
    }
    
    int main(int argc, char* argv[])
    {
    	Vektor v(15,3);
    	v.print();
    	v = test();
    	v.print();
    	return 0;
    }
    


  • Hallo,
    du hast zwar einen Copy-Ctor und einen Dtor (gut), aber dafür hast du den operator= vergessen. Den brauchst du aber hier:

    v = test();

    Der automatisch generierete Op= macht nur eine Kopie des Zeigers. Ergebnis: du löschst das Array zweimal.

    Das ist mal wieder ein gutes Beispiel für das "Law of Big Three"



  • gut, ich versuch's mal mit nem
    Vektor operator=(Vektor v) - Operator!
    Vielen Dank!!!
    Falls es nicht klappt meld ich mich nochmal! 😉



  • tobis79211 schrieb:

    gut, ich versuch's mal mit nem
    Vektor operator=(Vektor v) - Operator!

    Vektor& operator=(const Vektor& v) ist die gängige Signatur.


Anmelden zum Antworten