Virtueller Speicher von operator new()?
-
Betriebssysteme erlauben es ja, virtuellen Speicher anzufordern, was ich überaus praktisch finde. Nur seltsamerweise geht das nur mit malloc, nicht mit operator new.
#include <iostream> #include <limits> #include <memory> #include <cstdlib> int main() { // übersteigt die Kapatizät meines RAMs bei weitem const std::size_t s = std::numeric_limits<std::size_t>::max()/8; void *a = calloc(s,1); std::cout << "a" << std::endl; void *b = malloc(s); std::cout << "b" << std::endl; void *c = operator new(s); std::cout << "c" << std::endl; }Ausgabe:
a b terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc(Wenn ich operator new als erstes ausführe kommt immer noch ein bad_alloc.)
Hat jemand eine Idee, warum das so ist? Geht calloc/malloc nur zufällig oder wird das auch auf anderen Plattformen laufen?
-
Du wirst wahrscheinlich feststellen, dass a und b Nullzeiger sind. calloc und malloc werfen halt nur keine Exception.
-
Ja stimmt, da habe ich nicht richtig hingeschaut.
Seltsam ist, dass ich auf meinem 32-Bit-Linux so bis 3 GB allokieren kann, auf meinem 64-Bit-Linux mit gleich viel RAM nicht.
Weiss jemand, wie ich virtuellen Memory allokieren kann?
-
calle schrieb:
Seltsam ist, dass ich auf meinem 32-Bit-Linux so bis 3 GB allokieren kann, auf meinem 64-Bit-Linux mit gleich viel RAM nicht.
Zeig mal genau dein Programm.
Weiss jemand, wie ich virtuellen Memory allokieren kann?
Nur damit wir uns richtig verstehen: Was meinst du mit virtuellem Memory, den man allokieren kann?
Meinst du einfach Speicher, der wer weiß wohin gemapped ist, potentiell auch eine Festplatte? Das ist ohnehin das ganz normale Vorgehen, also das, was du schon die ganze Zeit machst mit malloc/new.Oder meinst du mehr Speicher anzufordern, als der Speichermanager überhaupt zur Verfügung hat und sobald man ihn trotzdem benutzt, gibt es eine Page Fault?