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

idontknow

unregistriert

11

21.06.2014, 10:13

Im GPU Speicher kannst du auf üblichem Wege nicht direkt Speicher allokieren, deswegen solltest du da kein Problem mit typischen Memory Leaks haben.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

21.06.2014, 10:28

Sofern der Treiber ordentlich arbeitet. Natürlich können Objekte und Texturen dort verbleiben, falls man sie nicht löscht und der Treiber dies ebenfalls nicht tut.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

13

22.06.2014, 13:26

Das meint er nicht. Er meint, dass du mit free()/delete einen Memorybereich zwar wieder für andere Anwendungen freigibst, deine Daten aber noch drinstehen. Bei sensitiven Daten sollte man den Speicher deswegen vorher mit Ramsch-/Nullbytes füllen.
Nicht ganz richtig – das SecureZeroMemory() ist für den Fall, dass ein Exploit im Prozess selber auftritt und die allokierten Seiten durchsucht. Andere Prozesse können freigegebene Daten sowieso nicht mehr auslesen weil Windows grundsätzlich alle Speicherkacheln nullt bevor sie einem Prozess zur Verfügung gestellt werden. (Ebenso wie die Sektoren des Dateisystems genullt werden bevor eine Datei drauf angelegt wird, was eine bekannte Leistungseinbuße ist.)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

22.06.2014, 14:03

weil Windows grundsätzlich alle Speicherkacheln nullt bevor sie einem Prozess zur Verfügung gestellt werden
Ist das so? Denn dann frage ich mich wieso neu allozierte Arrays so viele Müll-Daten enthalten. Oder sprichst Du von Debug-Runtimes?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

15

22.06.2014, 14:05

Ist immer so; das ist Teil der Prozessisolation. Der Müll, den du siehst, kommt aus deinem EIGENEN Prozess. Falls du es schaffen würdest, Müll eines anderen Prozesses zu sehen, hättest du ein wirklich übles Sicherheitsleck entdeckt.

Tatsächlich gibt es unter Windows genau einen Systemprozess allerniedrigster Priorität: Den Dienst, der nichts anderes tut, als freigegeben Speicher zu nullen damit das nicht erledigt werden muss wenn Anwendungen anfangen, Speicher zu allokieren.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

22.06.2014, 14:06

Woher kommt der Müll wenn bisher vom eigenen Prozess immer nur Speicher angefordert, aber nie welcher freigegeben wurde?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

17

22.06.2014, 14:08

Woher weißt du, dass nichts freigegeben wurde? Allein die C-Runtime legt bei der Initialisierung ein ganzes Dutzend Objekte an und gibt sie wieder frei. Die DLLMains abhängiger Module bereiten ihre Daten vor. Nicht zuletzt braucht der Image Loader, der dein EXE-Modul in den Adressraum lädt, auch ein Bisschen Platz für Temporäres.

Z.B. muss auch die Kommandozeile geparst werden, damit deine main() argc und argv erhält. Das schließt auch die Konvertierung von UTF-16 zu ANSI ein. Und jede WinAPI-Funktion, die du dabei aufrufst, allokiert vielleicht selber was, dessen Überreste du dann siehst (schließlich will man erreichen, dass möglichst viel im User Mode arbeitet).

Simples Experiment: Mach VirtualAlloc() und prüf, dass die Seite genullt ist. Du wirst nie eine ungenullte finden. Der Müll kommt also aus bereits bestehenden Allokationen, irgendwo in der CRT.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Krishty« (22.06.2014, 14:13)


Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

18

22.06.2014, 14:28

Ja, VirtualAlloc garantiert dir einen ausgenullten Speicher-Block. Allerdings ist das nicht zwingend für die Klassiker wie malloc garantiert. Und was HeapAlloc und so tun weiß ich nicht.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

19

22.06.2014, 14:37

Ja; und malloc und HeapAlloc kriegen ihren Speicher auch nur von VirtualAlloc. Was immer also drin steht, es kann unmöglich von einem anderen Prozess kommen.

Übrigens bezieht sich das Nullen auch auf andere Aspekte: Die Page File wird genullt sobald eine Kachel freigegeben oder in den Speicher zurückgeholt wird (damit sensible Daten nicht im Klartext auf der Platte stehen).

Werbeanzeige