2010-03-02 22 views
6

Meine Entwicklungsumgebung ist VS2008, DX9, Windows XP. Ich versuche, die Schutzbehandlung zu dem nicht mehr benötigten Arbeitsspeicher hinzuzufügen. Wenn Malloc NULL zurückgibt, würde ich einige Ressourcen auf die Festplatte pagen und die Ressourcen im Speicher freigeben.Warum malloc immer Null zurückgeben

Aber manchmal, malloc immer NULL zurückgeben, auch wenn ich die meisten Ressourcen freigeben und Prozessspeicherauslastung und VM-Größe ist nur 800 MB im Task-Manager.

Ich denke, malloc zu verwenden, um 88 Bytes zuzuordnen sollte in Ordnung sein, wo Prozessspeicherauslastung ist nur 800 MB. Aber malloc gibt immer NULL zurück.

Könnte das Speicherfragmentierung sein? Es sieht nicht so aus, da die Prozessspeicherauslastung nicht zu groß ist.

alt text http://i.imagehost.org/0267/Snap2.jpg

+1

Können Sie uns Code zeigen? –

+0

Exe wurde von VS-Debugger gestartet und angehängt. – Buzz

+0

void * AllocCRT (Größe_T Größe) { Rückgabe malloc (Größe); } Mem Verwendung: 644,088K VM-Größe: 671.064K – Buzz

Antwort

2

Sie erwähnten Speicherfragmentierung und das wäre sicherlich meine erste Vermutung sein. Versuchen Sie, die Anwendung this herunterzuladen. Es heißt Address Space Monitor, und sollte Ihnen zeigen können, wenn es ein Fragmentierungsproblem ist.

+1

Dieser Monitor analysiert den Prozessadressraum nach Betriebssystem, während "malloc" in MSVC über die Windows Heap-API funktioniert. Es reserviert Speicher nicht direkt vom System und gibt es nicht direkt an das System zurück. Was bedeutet, dass dieser Monior Ihnen nichts zeigen kann. Für Monitore wie diesen würde der gesamte Programm-Heap wie eine undurchdringliche schwarze Box mit für immer vergebenen Speicher aussehen. – AnT

+0

@AndreyT: Ich denke, dass "dir nichts zeigen wird" ist ein bisschen stark. Der Prozess-Heap verwendet den Benutzeradressraum, sodass Sie sehen können, wann dieser erschöpft ist. Das bedeutet nicht, dass malloc nicht in der Lage ist, Speicher zuzuweisen, den der Heap bereits reserviert hat. Was es also sollte, wenn es freien Adressraum gibt, den der Heap beanspruchen könnte, wenn er mehr Speicher reservieren muss, als er bereits reserviert hat. –

2

Es könnte virtuelle Adressraumfragmentierung sein. Eine Möglichkeit, dies zu überprüfen, ist die Nummer HeapCompact(GetProcessHeap(), 0). Wenn das genug Speicher freigibt, dann ist das die wahrscheinliche Ursache.

Eine andere ähnliche Ursache würde vom Debugger gestartet werden; Das verursacht, Windows den Debug-Heap zu verwenden, der über einen langen Zeitraum wirklich wirklich schlechtes Speicherverhalten hat. Um dieses Verhalten zu deaktivieren, setze _NO_DEBUG_HEAP=1 in der Umgebung und laufe.

0

Eine andere Möglichkeit ist, dass ein Fehler in Ihrem Programm vorhanden ist. Sie denken, Sie fragen nach 88 Bytes, aber vielleicht übergeben Sie eine nicht initialisierte Variable und fragen nach Hunderten von Megabyte. Oder vielleicht hat etwas, was Sie zuvor gemacht haben, einen Puffer überlaufen und den Heap verfälscht, was dazu geführt hat, dass malloc() danach immer wieder fehlgeschlagen ist.

Verwandte Themen