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 AdressenMir 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::Stringoder 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.