Bei delete Absturz



  • Moin zusammen!

    Ich habe folgende Klasse

    class CPerson
    {
    private:
    	char* m_szfirst_name;
    //weitere Member
    
    public:
    	CPerson(char* first_name,char* last_name,char* adress,char* city,int plz);
    	~CPerson();
    };
    

    Im Konstruktor wird Speicher für m_szfirst_name allociert und die Übergebenen Daten umkopiert.
    Das klappt alles soweit first_name hat nen gültigen Pointer und der Inhalt stimmt auch.
    Doch es kracht leider im Destruktor.
    Hier der Code dafür:

    CPerson::~CPerson()
    {
    	printf("Destruktor Person\n");
    	if (m_szfirst_name != NULL)
    		delete [] m_szfirst_name;
    }
    

    Es wäre nett wenn mir jemand erklären könnte wie ich mein Programm richtig beenden kann ohne einen Fehler. Ich stehe nämlich deswegen ziemlich auf dem Schlauch, da ich ja mit delete[] ein Feld freigebe. Von welchem Datentyp sollte doch eigentlich egal sein, oder?

    Vielen Dank
    BastlWastl



  • Der Fehler liegt an anderer Stelle.



  • ich nehme mal an, in deinem konstruktor steht irgendwas der art

    m_szfirst_name = first_name

    jetzt gibt es zwei offensichtliche möglichkeiten:

    1. der ursprüngliche pointer, der bei der instanziierung verwendet wurde, wurde bereits aufgeräumt, bevor deine klasse zerstört wird

    2. du hast die klasse mit nem const instanziiert CPerson foo("Hans"...) und delete greift dabei völlig ins leere



  • achso, ne lösung ^^

    variante 1: der pointer gehört nicht dem objekt, also kümmert es sich auch nicht drum, den aufzuräumen. das soll gefälligst derjenige machen, der das objekt verwenden will 😉

    variante 2: du erzeugst m_szfirst_name als neuen pointer auf char und kopierst den inhalt von first_name hinein



  • Noch nicht mal 10min für ne Antwort. WOW!!!

    Also mein Konstruktor sieht so aus:

    CPerson::CPerson(char* first_name,char* last_name,char* adress,char* city,int plz)
    {
    	printf("CPerson Konstruktor\n");
    
    	//Speicher allocieren
    	m_szfirst_name	= new char[strlen(first_name)];
    
    	//Daten umkopieren
    	strcpy(m_szfirst_name, first_name);
    }
    

    Ich mache in meinem Main bis jetzt nichts anderes als eine Person anzulegen und mit einer print Routine die einzellnen Variablen auf der Konsole auszugeben.
    Ich setze nirgendwo etwas auf NULL oder hantiere mit den Pointern weiter rum.



  • new char[strlen(first_name) + 1];



  • Einen Copykonstruktor hast du nicht? Das kann - je nachdem, wie du die Klasse benutzt - ins Auge gehen.

    Ach ja, die Prüfung auf ungleich Null vor delete ist komplett überflüssig.



  • Mit std::string wäre das nicht passiert.



  • Mit std::string wäre das nicht passiert.

    Mag sein, aber das hat man uns nicht gezeigt.

    Diese dumme dämliche "+1" vergesse ich doch jedes mal wieder. 😡

    Vielen Danke an alle für die Hilfe


Anmelden zum Antworten