AllocateMemory() zu klein » Warum geht das hier?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

ts-soft hat geschrieben:
AND51 hat geschrieben: > Du solltest noch den available Memory checken
Wie mache ich das denn? Mir fällt nur der Befehl ein, um zu ermitteln, wie viel Speicher der RAM der Grafikkarte hat. Oder meinst du ich soll den physikalischen RAM mit Hilfe einer API Funktion ermitteln?
Wenn interessiert der GraKa Speicher, der ist schnurz (4 MB sollten reichen :mrgreen: )
Nein, mehr als die hälfte des verfügbaren Speichers würde ich ungerne
benutzen.

Code: Alles auswählen

; Structure MEMORYSTATUS
;   dwLength.l
;   dwMemoryLoad.l
;   dwTotalPhys.l
;   dwAvailPhys.l
;   dwTotalPageFile.l
;   dwAvailPageFile.l
;   dwTotalVirtual.l
;   dwAvailVirtual.l
; EndStructure

Define.MEMORYSTATUS MyMem

GlobalMemoryStatus_(@MyMem)
Debug MyMem\dwAvailPhys
und damit es auch korrekt funktioniert auf systemen mit mehr als 4gb ram:

Code: Alles auswählen

Procedure.q GetFreeMemory()
  Library = OpenLibrary(#PB_Any, "kernel32.dll")
  If Library
    If OSVersion() >= #PB_OS_Windows_2000
      memex.MEMORYSTATUSEX
      memex\dwLength = SizeOf(MEMORYSTATUSEX)
      *Function = GetFunction(Library, "GlobalMemoryStatusEx")
      If *Function
        CallFunctionFast(*Function, @memex)
        Result.q = memex\ullAvailPhys
      EndIf
    Else
      mem.MEMORYSTATUS
      mem\dwLength = SizeOf(MEMORYSTATUS)
      *Function = GetFunction(Library, "GlobalMemoryStatus")
      If *Function
        CallFunctionFast(*Function, @mem)
        Result = mem\dwAvailPhys
      EndIf
    EndIf
    CloseLibrary(Library)
  EndIf
  ProcedureReturn Result
EndProcedure
Debug "Free Memory: "+Str(GetFreeMemory() / 1048576)+" MB"
edit: hab den code etwas abgeändert, da das direkte verknüpfen zu GlobalMemoryStatusEx_() unter win9x probleme bereiten wird. deswegen mache ich das ganze nun über OpenLibrary(), also nicht wundern. :wink:

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

AND51 hat geschrieben:AllocateMemory(): Ich reserviere 4 Byte, schreibe aber 5 rein. Da auf heuteigen PCs immer genug freie Kapazitäten vorhanden sind, geht das auch.
:lol:
Ein Programmierer verwendet die meiste Zeit darauf, sein Programm
Sicher und Fehlerfrei zu machen. Von einem Programmierer kann obiger Satz
also nicht stammen :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Ein überlauf ist ein hineinschreiben außerhalb des reservierten bereiches. Das geht deswegen (unter modernen betriebsystemen) nicht, weil der Speicher Virtualisiert und auch gegen fremdüberschreiben geschützt ist.

Wegen der MMU sieht dein allozierter bereich linear aus, aber das muß nicht physikalisch stimmen. Also die addresse, die für dein Programm als Addresse 0 aussieht ist in wirklichkeit irgend eine andere physikalische Addresse.

Wenn du jetzt 8kb Ram allozierst, dann kann es zufällig durchaus sein, dass die hintereinander im Speicher stehen. Es kann aber auch sein, dass deine Adresse byte 4096 (der begin deiner zweiten speicherhälfte) an einer ganz anderen stelle steht als das ende deiner ersten speicherhälfte byte 4095.

Dazwischen kann der Speicherbereich eines anderen Programmes stehen.

Es reicht aus Windows sicht nicht, dass der Speicher den du beschreiben willst frei ist (zumindest nicht unter den richtigen betriebsystemen NT/2k/XP/2003/Vista - unter pillepalle Win9x/ME geht es, ist aber nicht ratsam, da es mit extrem hoher wahrscheinlichkeit zu einem absturz führt), er muß auch von deinem Programm alloziert worden sein.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

In den Speicherbereich eines Fremdprogrammes kann er nicht gelangen,
er bleibt im virtuellen Speicher seines Programmes, aber dieses wird über
kurz oder lang abstürzen :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Unter Win9x/ME kam man aber schon in den Speicherbereich eines Fremden Programmes... darum konnte man das ja auch mit Pointerfehlern abschießen.

Das das heutzutage nichtmehr geht hab ich ja gesagt ;)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Meines Wissens nach, ist dies nur mit 16-Bit Anwendungen möglich, kann
mich aber auch Irren.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Vielen Dank für eure Infos, besonders die, Zahpod!
Das sind die Informationen, die ich mir gewünscht hab. Wie gut du das erklären kannst! :allright:

Gibt es da noch mehr Infos, bzw. so eine Art Tutorial oder Link oder soetwas? Aber bitte nicht so ein umständliches Nachschlagewerk.

> Ich reserviere 4 Byte, schreibe aber 5 rein. Da auf heuteigen PCs immer genug freie Kapazitäten vorhanden sind, geht das auch.
Bitte nicht falsch verstehen. Ich meinte, das sei der Grund, warum es funktioniert, mehr als eigentlich reserviert in einen allokierten Speicherbereich zu poken.
Das war ja meine Frage, wegen der ich diesen Thread ja eröffnet habe.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten