0

У меня есть приложение, которое выделяет память «новым» и освобождает их с помощью «delete» в некоторых частях кода. Проблема заключается в том, что всякий раз, когда он превышает лимит памяти системы (скажем, 2 ГБ), Windows отправляет сигнал Kill в этот процесс. Я думаю, что это не так, поскольку он должен использовать пространство подкачки (я думаю, что в окнах это называется виртуальной памятью), правильно? Мое приложение написано на C++/Visual Studio.Приложение на C++ превосходит память, но не использует виртуальную память

+2

AFAIK, 32-разрядный процесс не может использовать более 2 ГБ в Windows. – ZippyV

+1

Используйте 64-битную версию окон и создайте свою программу в качестве 64-битной цели, если вам нужно больше 2 ГБ. Это предел для 32-битного приложения. – user328543

+0

Я не использую 2 ГБ оперативной памяти в своем процессе. Около 1 ГБ уже используется Windows. Я использую около 1 ГБ ... но в целом он превышает память. Так что 32-разрядная проблема не так. – Nima

ответ

2

Here is how you can make it up to 3GB for a process; Это абсолютный максимум, который вы можете получить для 32-битных оконных приложений. Более того, вам придется использовать 64-битную версию окон.

Это очень много памяти. возможно, вы могли бы рассмотреть возможность разделения вашего приложения на несколько процессов и общения между ними.

1

Windows не использует сигналы. Вы должны получить исключение std :: badalloc, когда у вас закончится нехватка памяти. Который, когда uncaught, автоматически запустит функцию terminate(). Исключение отображается в окне «Вывод».

2

ОС не убивает приложение, необработанное исключение делает. Вам нужно будет изучить ваше приложение с помощью perfmon и посмотреть эти счетчики, рабочий набор, виртуальные байты, частные байты. Вы получите исключения, когда ваши зарезервированные байты будут близки к 2 ГБ. Таким образом, ваши байт-байты и RAM-байты намного меньше.

Here is a nice article on Virtual Address Space, including committed vs reserved.

Мораль этой истории, не пытаются выделить, когда зарезервированные байты приближается к 2 Гб, для 32-разрядного процесса.

Смежные вопросы