En ce qui concerne nouveau en C++/GCC/Linux (32 bits) ...
Il a été un certain temps, et il est dépendant de la mise en œuvre, mais je crois nouvelle sera, dans les coulisses, appelez malloc(). Malloc(), sauf si vous demandez quelque chose dépassant l'espace d'adressage du processus, ou en dehors des limites spécifiées (ulimit/getrusage), n'échouera pas. Même lorsque votre système n'a pas assez de RAM + SWAP. Par exemple: malloc (1gig) sur un système avec 256 Mo de RAM + 0 SWAP, je crois, réussir. Cependant, lorsque vous utilisez cette mémoire, le noyau fournit les pages via un mécanisme d'allocation différée. À ce stade, lorsque vous lisez ou écrivez d'abord dans cette mémoire, si le noyau ne peut pas allouer de pages de mémoire à votre processus, il tue votre processus.
Cela peut être un problème sur un ordinateur partagé, lorsque votre collègue a une fuite de base lente. Surtout quand il commence à assommer les processus du système. Par conséquent, le fait que vous voyiez des exceptions std :: bad_alloc est «intéressant».
Maintenant nouveau exécutera le constructeur sur la mémoire allouée, en touchant toutes ces pages de mémoire avant son retour. En fonction de la mise en œuvre, il pourrait piéger le signal de mémoire insuffisante.
Avez-vous essayé ceci avec plain o'l malloc?
Avez-vous essayé d'exécuter le programme "free"? Avez-vous assez de mémoire disponible?
Comme d'autres l'ont suggéré, avez-vous vérifié limit/ulimit/getrusage() pour dur & contraintes molles?
À quoi ressemble votre code, exactement? Je devine nouveau ClassFoo [N]. Ou peut-être nouveau char [N].
Qu'est-ce que sizeof (ClassFoo)? Qu'est-ce que N?
L'allocation de 64 * 288000 (17.58Meg) devrait être triviale pour la plupart des machines modernes ... Utilisez-vous un système embarqué ou quelque chose d'autre spécial?
Vous pouvez également créer un lien avec un nouveau allocataire personnalisé? Votre classe a-t-elle son propre nouvel allocateur?
Votre structure de données (classe) alloue-t-elle d'autres objets dans le cadre de son constructeur?
Est-ce que quelqu'un a trafiqué vos bibliothèques? Avez-vous plusieurs compilateurs installés? Utilisez-vous les mauvais chemins d'inclusion ou de bibliothèque?
Liez-vous des fichiers objets périmés? Avez-vous simplement besoin de recompiler tous vos fichiers sources? Pouvez-vous créer un programme de test trivial? Juste quelques lignes de code qui reproduisent le bug? Ou est-ce que votre problème est ailleurs et ne se manifeste que là?
-
Pour ce que ça vaut, je l'ai réparti sur des blocs de données 2gig avec nouvelle dans linux 32 bits sous g ++. Votre problème est ailleurs.
Avez-vous besoin de tout cela en une seule fois? Sinon, vous pouvez utiliser un pool de mémoire et un allocateur personnalisé pour gérer le pool. – dirkgently
Comme je l'ai dit, j'essaie de me moquer de ce que le code producteur va faire. J'utiliserais un pool de mémoire alloué statiquement si je le pouvais. – JeffV
Vous pouvez utiliser un pool alloué statiquement et remplacer vos appels par delete avec une fonction 'FreeBlock'. De cette façon, vous pouvez vérifier que vous avez rempli chaque bloc acquis. –