AccessViolationException bei return vin klassen instanz



  • Hey,
    bin recht neu in c++ und wollte mir jetzt einfach mal zum üben eine eigene string klasse schreiben jetzt gebe ich von der funktion test eine neue instanz der klasse zurück wobei es
    im DEBUG modus eine AccessViolationException gibt
    aber im RELEASE modus keinen fehler gibt hier der code:

    class TEST
    {
    private:
    	char* pDaten;
    	int iLength;
    public:
    	TEST()
    	{
    		pDaten = new char[1];
    		pDaten[0] = '\0';
    	}
    	TEST(const char* val)
    	{
    		iLength = strlen(val);
    		pDaten = new char[iLength + 1];
    		for(int i = 0;i < iLength;i++)
    			pDaten[i] = val[i];
    		pDaten[iLength] = '\0';
    	}
    	~TEST()
    	{
    		delete[] pDaten;
    	}
    
    	void operator=(TEST& rhs)
    	{
    		iLength = strlen(rhs.pDaten);
    		delete[] pDaten;
    		pDaten = new char[iLength + 1];
    		for(int i = 0;i < iLength;i++)
    			pDaten[i] = rhs.pDaten[i];
    		pDaten[iLength] = '\0';
    	}
    	void print() const
    	{
    		cout << pDaten << endl;
    	}
    	TEST test()
    	{
    		TEST result("test");
    		return result;
    	}
    };
    
    int main(int argc, char* argv[])
    {
    	TEST a = "---";
    	TEST b = a.test();
    	b.print();
    
    	while(1);
    	return 1;
    }
    

    hoffe ihr findet einen fehler
    mfg


  • Administrator

    Die Implementation eines Kopierkonstruktors wäre sehr sinnvoll. Sonst wird einfach nur der Zeiger und die Länge kopiert. Im alten Objekt wird das Array gelöscht und der Zeiger im neuen Objekt zeigt auf ungültigen Speicher.

    Grüssli



  • aubacke stimmt 🙂 hab da mal wieder was durcheinander gebracht
    aber werds direkt fixen
    danke nochmals
    bye



  • Du solltest auch schauen, dass du alle Member initialisierst. Am besten in der Konstruktor-Initialisierungsliste. Beim Standardkonstruktor hast du zum Beispiel iLength vergessen... 😉

    Ausserdem würde ich beim Zuweisungsoperator (und dann auch beim Kopierkonstruktor) einen Parameter als Referenz auf konstantes Objekt (Const-Reference) nehmen. Also const TEST& rhs statt TEST& rhs .

    Ach ja, und was willst du mit while (1) ? Um die Konsole offen zu halten, gibt es bessere Methoden. Versuchs mal mit cin.get(); oder schaue in den FAQ nach...


Anmelden zum Antworten