Относительно new в C ++ / GCC / Linux (32bit) ...
Прошло много времени, и это зависит от реализации, но я верю, что new негласно вызовет malloc () . Malloc () , если только вы не запросите что-либо, превышающее адресное пространство процесса или выходящее за пределы указанного ( ulimit / getrusage ) предела, произойдет сбой. Даже когда вашей системе не хватает RAM + SWAP. Например: malloc (1gig) в системе с 256Meg RAM + 0 SWAP, я полагаю, будет успешным.
Однако, когда вы используете эту память, ядро предоставляет страницы с помощью механизма отложенного размещения. В этот момент, когда вы впервые читаете или пишете в эту память, если ядро не может выделить страницы памяти для вашего процесса, оно убивает ваш процесс.
Это может быть проблемой на общем компьютере, когда у вашего коллеги медленная утечка ядра. Особенно, когда он начинает выбивать системные процессы.
То, что вы видите исключения std :: bad_alloc, "интересно".
Теперь new будет запускать конструктор в выделенной памяти, касаясь всех этих страниц памяти, прежде чем он вернется. В зависимости от реализации, может перехватывать сигнал нехватки памяти.
Вы пробовали это с обычным o'l malloc ?
Вы пытались запустить программу " free "? Достаточно ли у вас памяти?
Как и предполагали другие, проверяли ли вы limit / ulimit / getrusage () для жестких и мягких ограничений?
Как именно выглядит ваш код? Я предполагаю новый ClassFoo [N] . Или, возможно, новый символ [N] .
Что такое sizeof (ClassFoo) ? Что такое N ?
Выделение 64 * 288000 (17,58Meg) должно быть тривиально для большинства современных машин ... Вы работаете на встроенной системе или чем-то особенным?
В качестве альтернативы, вы связываетесь с пользовательским новым распределителем? У вашего класса есть собственный новый распределитель?
Распределяет ли ваша структура данных (класс) другие объекты как часть своего конструктора?
Кто-нибудь вмешивался в ваши библиотеки? У вас установлено несколько компиляторов? Вы используете неправильные пути включения или библиотеки?
Вы ссылаетесь на устаревшие объектные файлы? Вам просто нужно перекомпилировать все ваши исходные файлы?
Можете ли вы создать тривиальную тестовую программу? Всего пара строк кода, который воспроизводит ошибку? Или ваша проблема в другом месте, и только появляется здесь?
-
Для чего бы то ни было, я выделил более 2-гигабайтных блоков данных с new в 32-битном Linux под g ++. Ваша проблема лежит в другом месте.