Heapverletzung
-
Hallihallo,
eine simple Frage:Wieso bekomme ich hier die Meldung, der Heap würde verletzt?
std::string itos(int Value) //int to string { static char *Result = 0; if (Result != 0) delete[] Result; int Chars = 0; for (int i = 1; true; i = i*10) { if (Value/i < 1) break; Chars++; } Result = new char[Chars]; printf("%d\n",Result); sprintf(Result,"%d",Value); return std::string(Result); }lg Max
-
Wieso deklarierst du Result als static? Desweiteren verstehe ich nicht so recht, was diese Zeile bewirken soll:
if (Result != 0) delete[] Result;Result wurde doch eine Zeile darüber expliziert als 0 definiert!?
-
std::string itos(int Value) //int to string { static char *Result = 0; if (Result != 0) delete[] Result; int Chars = 0; for (int i = 1; true; i = i*10) { if (Value/i < 1) break; Chars++; } Result = new char[Chars]; printf("%d\n",Result); sprintf(Result,"%d",Value); return std::string(Result); }(1) Warum static char* Result?
(2) delete [] ist definiert. if (Result != NULL) ist demnach unnötig.
(3) unsigned vor "Chars".
(4)for (std::size_t i(1); Value / i == 0; i *= 10)...
(5) Du hast Ganzzahldevision da stehen ... sicher das du das willst?
(6) std::cout statt std::printf
(7) %d steht für Integer, nicht für String!Wenn du einen Integer in einen String packen willst, dann geht das viel einfacher!
std::ostringstream ss; ss << integer; std::string result(ss.str());.
-
TdZ schrieb:
Wieso deklarierst du Result als static? Desweiteren verstehe ich nicht so recht, was diese Zeile bewirken soll:
if (Result != 0) delete[] Result;Result wurde doch eine Zeile darüber expliziert als 0 definiert!?
Naja, kann man schon machen ... aber ich halte
- das in dem Fall vollkommen überflüssig und gefährlich (thread safety ? geschachtelte Aufrufe ? ...)
- ebenso die Verwendung von char und
- die gesamte Funktion überhaupt.
Diese "static"-Verwendung sieht mir nach einem (irgendwo mal gelernten, aber inzwischen veralteten) "Standardtrick aus C-Zeiten" aus.Wenn selbst unser char*-Freund (D)Evil schon string(stream)s vorschlägt, wird's eng. ...

Gruß,
Simon2.
-
Danke Jungs!
lg Max