Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Anonymous
unregistriert
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 |
char* Funktion (void) { return "Hallo"; } WinMain (..., ..., ..., ...) { char* Pointer = Funktion (); return 0; } |
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
char* Funktion (void) { char *Temp = new char[strlen("Hallo")]; sprintf(Temp,"%s","Hallo"); return Temp; } WinMain (..., ..., ..., ...) { char* Pointer = Funktion (); return 0; } |
Administrator
Zitat von »"DragonMaster"«
Nein das tut er nicht. Leider. Aber der Speicherplatz ist nicht mehr gültig, da du ein Konstantes Objekt zurück gibst, das beim verlassen der Funktion wieder gelöscht wird. Allerdings müste der Compiler einem min. darauf hinweisen.
Zitat von »"ghostie"«
Aehm wenn ich delete aufrufen würde, würde das ding NULL oder irgendwas anderes zurück geben.
Zitat von »"ghostie"«
// Edit:
Ausserdem hab ich bei mir dazu NEW Überladen so das es beim Shutdown alles nicht freigegebene frei gibt. Sehr nützlich
Anonymous
unregistriert
Zitat von »"David Scherfgen"«
Zitat von »"DragonMaster"«
Nein das tut er nicht. Leider. Aber der Speicherplatz ist nicht mehr gültig, da du ein Konstantes Objekt zurück gibst, das beim verlassen der Funktion wieder gelöscht wird. Allerdings müste der Compiler einem min. darauf hinweisen.
Ich glaube das stimmt nicht, Stephan! Soweit ich weiß ist es wie folgt: Der Compiler legt für alle möglichen Strings, die im Quelltext vorkommen, einen extra Speicherbereich an, der fest ist. Man müsste es mal testen, aber ich bin der Meinung, dass es geht!
Quellcode |
|
1 2 3 4 5 6 7 8 9 |
char* func() { return "Hallo"; } int main(void) { char* temp = func(); std::cout << temp << std::endl; return 0; } |
Quellcode |
|
1 |
*(temp + 1) = 'B'; |
Das ist relativ einfach. Du brauchst eine Sammelstelle wo du die Adressen der reservierten Speicherbereiche ablegst und als zusätzliche Information must du noch wissen ob es ein Array ist oder nicht. Am besten ist so was als Singleton anzulegen. Wenn das Singleton dann beim Programmende beendet wird, kannst du nicht freigegebenen Speicher durch den Destruktor automatisch freigeben lassen. Hier einfach delete oder delete[] aufrufen.Zitat
Wie überlädt man den new operator, so dass er die Sachen aufräumt?
Werbeanzeige