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
-
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
iLengthvergessen...
Ausserdem würde ich beim Zuweisungsoperator (und dann auch beim Kopierkonstruktor) einen Parameter als Referenz auf konstantes Objekt (Const-Reference) nehmen. Also
const TEST& rhsstattTEST& rhs.Ach ja, und was willst du mit
while (1)? Um die Konsole offen zu halten, gibt es bessere Methoden. Versuchs mal mitcin.get();oder schaue in den FAQ nach...