Du bist nicht angemeldet.

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

1

30.07.2003, 23:45

char*

Quellcode

1
2
3
4
5
6
7
8
9
10
11
char* Funktion (void)
{
return "Hallo";
}

WinMain (..., ..., ..., ...)
{
char* Pointer = Funktion ();

return 0;
}


Zeigt Pointer jetzt auf NULL?

2

31.07.2003, 02:27

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.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

3

31.07.2003, 03:32

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; 
}


Sollte gehen. Wenn was falsches dran ist darf David mir die 2. Auflage seines Buchs gratis schicken damit ich lernen kann :D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

31.07.2003, 07:00

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!

5

31.07.2003, 15:47

jo David hat recht.

@ghostie: Du erzeugst ein schönes Memoryleak. new ohne delete. Es gibt nur einen Heap für ein Programm und der wird nicht, wie der Stack, beim Funktionsrücksprung aufgeräumt!
Ein Gespenst geht um in Europa...

6

31.07.2003, 15:55

Aehm wenn ich delete aufrufen würde, würde das ding NULL oder irgendwas anderes zurück geben.

// Edit:

Ausserdem hab ich bei mir dazu NEW Überladen so das es beim Shutdown alles nicht freigegebene frei gibt. Sehr nützlich :)

7

31.07.2003, 16:02

Zitat von »"ghostie"«

Aehm wenn ich delete aufrufen würde, würde das ding NULL oder irgendwas anderes zurück geben.


Wenn du delete aufrufen würdest, würde er nicht NULL zurückgeben. Er gibr einfach die Adresse des ersten Bytes von Temp zurück, allerdings könnte der Speicher da bereits wieder für anderes genutzt worden sein und das wäre dann nicht so gut, wenn du weißt was ich meine ;) .

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 :)


Das ist nützlich, das stimmt, geht aber nicht aus deinem Code hervor.
Ein Gespenst geht um in Europa...

Anonymous

unregistriert

8

31.07.2003, 17:46

Wie überlädt man den new operator, so dass er die Sachen aufräumt?

9

31.07.2003, 22:17

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!

Also ich hab mal ein kleines Prog dazu geschrieben.

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;
}
Da haste recht. Da der Speicher nicht mit Nullen aufgefült wird, bleibt der String erhalten. Aber es ist KEIN gültiger Speicherbereich mehr! Denn sobald man versucht in diesen String zu schreiben, wird zu min. Win2K und XP anfangen zu meckern.

Quellcode

1
*(temp + 1) = 'B';


Zitat

Wie überlädt man den new operator, so dass er die Sachen aufräumt?
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.
Das ist zwar sehr Praktisch, da man sicher sein kann, daß das Programm seinen Müll auch wircklich aufräumt. Man sollte es aber eher für Debug zwecke einsetzen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige