2013-07-26 4 views
0

Я отлаживаю программу, которая разбилась, потому что для моего вектора, который нужно перераспределить, нельзя использовать непрерывную память. Итак, у меня вопрос, почему виртуальная память не используется? Каким образом можно использовать виртуальную память? Благодарю.Когда будет использоваться виртуальная память (окна)?

+0

Сколько памяти требуется для перераспределения? – Inspired

+0

Знаете ли вы, что такое виртуальная память? –

ответ

2

Виртуальная память автоматически используется ОС. Вам не нужно заботиться об этом.

В вашем случае, скорее всего, вы запустите 32-битное приложение. Пользовательское адресное пространство для 32-разрядного процесса в Windows ограничено 2 ГБ (ну, 3 ГБ, если Windows загружается с определенным ключом). Если вашему вектору требуется более нескольких сотен мегабайт смежного адресного пространства, это может стать проблемой (из-за фрагментации адресного пространства).

Конечно, любой процесс может закончиться без памяти (даже при использовании виртуальной памяти и файла подкачки и всего остального). Взгляните на использование памяти вашей программой в диспетчере задач.

+0

В настоящее время используется память 300 МБ, тогда это необходимо перераспределить. Да, это 32-битное приложение. Thannks. – user1558064

1

Виртуальная память - это единственная память, которую вы когда-либо получали как программу, работающую на современной ОС (Linux, Unix, Windows, MacOS, Symbian и т. Д.).

Похоже, ваша проблема в том, что не существует одного смежного диапазона виртуальных адресов, который достаточно велик для вашего вектора [1]. Я подозреваю, что происходит то, что вам нужно, скажем, более 1,5 ГБ в 32-битном процессе, который может использовать только 2 ГБ одновременно, поэтому на каждом конце не так много «комнаты», чтобы набивать другие биты до «средний» меньше 1,5 ГБ - в частности, если у вас есть вектор, который растет, вам понадобятся две копии вектора, одна в текущем размере и одна в два раза, чтобы скопировать.

Простым решением, если вы знаете, насколько велик вектор, нужно установить его размер, например. vector<int> vec(some_size);

Если вы не знаете, есть еще несколько решений:

Если у вас есть 64-битная ОС, вы можете попробовать установить LARGEADDRESSAWARE флаг для исполняемого файла (если это Windows). Это должно дать вам еще больший объем памяти, поскольку 64-разрядная ОС не должна резервировать большой кусок пространства памяти для самой ОС (которая живет далеко за пределами 32-разрядного диапазона адресов. В 32-разрядной ОС , вам необходимо загрузить операционную систему с/3GB и установите выше флаг.

Или компилировать код как 64-бит (после обновления до 64-разрядной ОС, если это необходимо).

[1] Если, конечно, вы не пишете драйвер и не пытаетесь выделить много мегабайт физической памяти в качестве буфера для использования в DMA, но, я думаю, вы бы так сказали.

0

Проблема не имеет ничего общего с памятью или даже с виртуальной памятью. Массив требует смежного диапазона адресов. Адрес s темп (обычно 2 ГБ в программе Win32) фрагментирован, так что доступного места недостаточно.

Если бы вы могли получить адреса, Windows автоматически обеспечила бы виртуальную память, чтобы идти с ними.

Пришло время переместить приложение до 64 бит.

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