Im Hinblick auf neue in C++/GCC/Linux (32 Bit) ...
Es ist eine Weile her, und es ist die Umsetzung abhängig, aber ich glaube neue wird, hinter den Kulissen, rufen malloc(). Malloc(), sofern Sie nicht nach etwas fragen, das den Adressraum des Prozesses überschreitet, oder außerhalb der angegebenen Grenzwerte (ulimit/getrusage) nicht fehlschlagen. Selbst wenn Ihr System nicht genug RAM + SWAP hat. Zum Beispiel: malloc (1gig) auf einem System mit 256 Meg RAM + 0 SWAP wird, glaube ich, gelingen.
Wenn Sie jedoch diesen Speicher verwenden, stellt der Kernel die Seiten über einen Mechanismus für die verzögerte Zuweisung bereit. An diesem Punkt, wenn Sie den Speicher zum ersten Mal lesen oder in diesen schreiben, wenn der Kernel dem Prozess keine Speicherseiten zuweisen kann, wird Ihr Prozess beendet.
Dies kann ein Problem auf einem gemeinsam genutzten Computer sein, wenn Ihr Kollege ein langsames Kernleck hat. Vor allem, wenn er damit beginnt, Systemprozesse auszulöschen.
Die Tatsache, dass Sie std :: bad_alloc Ausnahmen sehen, ist also "interessant".
Jetzt neue wird den Konstruktor auf dem zugewiesenen Speicher ausführen und alle diese Speicherseiten berühren, bevor es zurückkehrt. Je nach Implementierung kann das Out-of-Memory-Signal abfangen.
Haben Sie das mit blanko malloc versucht?
Haben Sie versucht, das Programm "frei" auszuführen? Hast du genug Speicher zur Verfügung?
Wie andere vorgeschlagen haben, haben Sie limit/ulimit/getrusage() für hart & soft constraints?
Wie sieht Ihr Code genau aus? Ich schätze neue ClassFoo [N]. Oder vielleicht neue Kohle [N].
Was ist sizeof (ClassFoo)? Was ist N?
Zuordnung von 64 * 288000 (17.58Meg) sollte für die meisten modernen Maschinen trivial sein ... Laufen Sie auf einem Embedded-System oder etwas anderes Besonderes?
Verknüpfen Sie alternativ mit einem benutzerdefinierten neuen Zuordner? Hat Ihre Klasse einen eigenen neuen Allokator?
Ordnet Ihre Datenstruktur (Klasse) andere Objekte als Teil ihres Konstruktors zu?
Hat jemand Ihre Bibliotheken manipuliert? Haben Sie mehrere Compiler installiert? Verwenden Sie die falschen Include- oder Bibliothekspfade?
Verlinken Sie gegen veraltete Objektdateien? Müssen Sie einfach alle Ihre Quelldateien neu kompilieren?
Können Sie ein triviales Testprogramm erstellen? Nur ein paar Zeilen Code, der den Fehler reproduziert? Oder ist dein Problem anderswo und nur hier auftauchen?
-
Für das, was es wert ist, ich über 2gig Datenblöcke zugewiesen haben mit neuen in 32-Bit-Linux unter g ++. Dein Problem liegt woanders.
Benötigen Sie alles auf einmal? Andernfalls könnten Sie einen Speicherpool und einen benutzerdefinierten Zuordner verwenden, um den Pool zu verwalten. – dirkgently
Wie gesagt, ich versuche zu verspotten, was der produzierende Code machen wird. Ich würde einen statisch zugewiesenen Speicherpool verwenden, wenn ich könnte. – JeffV
Sie könnten einen statisch zugewiesenen Pool verwenden und Ihre zu löschenden Anrufe durch eine "FreeBlock" -Funktion ersetzen. Auf diese Weise können Sie überprüfen, ob Sie jeden erworbenen Block gefüllt haben. –