Con respecto a nueva en C++/GCC/Linux (32 bits) ...
Ha sido un tiempo, y es dependiente de la implementación, pero creo nueva será, detrás de las escenas, invocar malloc(). Malloc(), a menos que solicite algo que exceda el espacio de direcciones del proceso, o fuera de los límites especificados (ulimit/getrusage), no fallará. Incluso cuando su sistema no tiene suficiente RAM + SWAP. Por ejemplo: malloc (1gig) en un sistema con 256 Meg de RAM + 0 Creo que SWAP tendrá éxito.
Sin embargo, cuando vaya a usar esa memoria, el núcleo suministrará las páginas a través de un mecanismo de asignación diferida. En ese punto, cuando lee o escribe por primera vez en esa memoria, si el kernel no puede asignar páginas de memoria a su proceso, mata su proceso.
Esto puede ser un problema en una computadora compartida, cuando su colega tiene una fuga de núcleo lento. Especialmente cuando comienza a noquear los procesos del sistema.
El hecho de que esté viendo excepciones std :: bad_alloc es "interesante".
Ahora nuevo ejecutará el constructor en la memoria asignada, tocando todas esas páginas de memoria antes de que regrese. Dependiendo de la implementación, podría atrapar la señal de falta de memoria.
¿Has probado esto con malloc?
¿Ha intentado ejecutar el programa "libre"? ¿Tienes suficiente memoria disponible?
Como han sugerido otros, ¿ha comprobado límite/ulimit/getrusage() para hard & restricciones suaves?
¿Cómo se ve tu código, exactamente? Supongo new ClassFoo [N]. O quizás nuevo carácter [N].
¿Qué es sizeof (ClassFoo)? ¿Cuál es N?
La asignación de 64 * 288000 (17.58 Meg) debería ser trivial para la mayoría de las máquinas modernas ... ¿Se ejecuta en un sistema integrado o algo especial?
O bien, ¿está enlazando con un nuevo nuevo asignador? ¿Su clase tiene su propio nuevo asignador?
¿Su estructura de datos (clase) asigna otros objetos como parte de su constructor?
¿Alguien ha manipulado sus bibliotecas? ¿Tienes múltiples compiladores instalados? ¿Estás utilizando las rutas de acceso o biblioteca incorrectas?
¿Está vinculado a archivos de objetos obsoletos? ¿Simplemente necesita recompilar todos sus archivos fuente?
¿Se puede crear un programa de prueba trivial? ¿Solo un par de líneas de código que reproducen el error? ¿O es tu problema en otra parte, y solo aparece aquí?
-
Por lo que vale la pena, he asignado más bloques de datos 2gig con nuevo en Linux de 32 bits bajo g ++. Tu problema está en otra parte.
¿Necesita todo eso de una vez? De lo contrario, podría usar un grupo de memoria y un asignador personalizado para administrar el grupo. – dirkgently
Como dije, estoy tratando de burlarme de lo que hará el código de producción. Yo usaría un grupo de memoria asignado estáticamente si pudiera. – JeffV
Puede usar un grupo asignado estáticamente y reemplazar sus llamadas para eliminar con una función 'FreeBlock'. De esta forma puede verificar que ha llenado cada bloque adquirido. –