Pointer freigeben mit delete



  • Hi,

    ich habe hier ein kleines Problem mit einem char Array. Folgender Code erzeugt eine Fehlermeldung im laufenden Programm, sobald das delete[] am Ende ausgeführt wird und zwar sowas:

    *** gdlibc detected *** ./programmname: free(): invalid pointer: 0xb7f805bc
    ========== Backtrace: =============
    weitere Adressen

    Mir ist klar, dass es ein Speicherfreigabe Problem auf dem Heap ist. Der Pointer ist wohl nach dieser Zeile:

    request = string(ptrRequest);
    

    nicht mehr ansprechbar auf dem Heap! Oder?

    Ich habe auch

    request = ptrRequest;
    

    versucht, ist das selbe Problem.

    Hier der wichtige Teil aus dem Code:

    char* ptrRequest = new char[SIZE];
    
    //jetzt wird ptrRequest korrekt gefüllt
    
    request = string(ptrRequest);
    
    delete[] ptrRequest; // FEHLERMELDUNG!
    

    Ist glaube ich ein bekanntes Problem, aber ich habe keine Lösung dazu gefunden. Kann mir jemand helfen?



  • Was ist "string" für ein Objekt ?



  • string(ptrRequest) soll ein Objekt der Klasse string erstellen.

    So rufe ich doch den Konstruktor der Klasse string auf, oder nicht?

    Ich habe es aber auch schon einfach so versucht:

    request = ptrRequest;

    Wie gesagt, beides hat den selben Effekt. Die delete[] Anweisung am Ende klappt nicht. Hat was mit dem Heap zutun, denke ich.



  • Was ist string

    System::String
    std::String

    oder anderst gefragt:
    Was macht der Konstruktor der unbekannten Klasse string ?



  • ich nehme die std:string Klasse. Habe sie inkludiert per #include <string> und die using namespace std Angabe. Die Klasse string ist schon bekannt, ich verwende ja ein paar Methoden daraus.

    Achso, request ist natürlich auch ein Objekt der Klasse string. Deswegen ja die Zuweisung, die auch klappt.



  • Ja schön für Dich das die Klasse bekannt ist, aber da Du explizit in C++/CLI postest ist nicht davon auszugehen das es std::string ist.



  • Funktioniert ohne Probleme:

    #include "stdafx.h"
    #include <string>
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	char * ptrRequest = new char[255];
    	strcpy(ptrRequest,"Hallo Welt");
    
    	string t = string(ptrRequest);
    
    	delete[] ptrRequest;
    }
    

    Prüfe also was Du sonst noch mit ptrRequest anstellst (beim Füllen unsinn gemacht o.Ä. ?)



  • ok danke, hab den Fehler gefunden. Diese Zeile habe ich

    ptrRequest = (char *) request.c_str();
    

    entfernen müssen, weil sie im kontext unsinnig und falsch war.

    Vielen dank für deine Geduld.



  • Öhm.... das is dreist ;o)

    c_str() gibt einen const char* zurück und da darf nix rein geschrieben werden, auch nich gelöscht. Das gehört std::string und ist nur zum lesen da. Also: Finger weg 🤡



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Log in to reply