Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 28.02.2015
Сообщений: 8

Почему не вылетает ошибка при выделении памяти под динамический массив, размером 100 Гб?

14.04.2015, 16:03. Показов 2161. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, знатоки!
Столкнулся с проблемой выделения памяти под динамические массивы. При создании массива более [n][m][k]
программа вылетает с ошибкой. Решил проверить сколько всего памяти могу выделить под массив:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
int main()
{
    for (int i=0;;i++)
    {
        float*array=new float[i];
        for(int j=0;j<i;j++)
        {
            array[j]=0;
        }
        std::cout<<i<<" : "<<sizeof(float)*i/(1024*1024)<<"Gb\n";
        delete []array;
    }
}
Размер массива перевалил за 100 ГБ, а ошибки не вылетает, почему?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.04.2015, 16:03
Ответы с готовыми решениями:

Ошибка при выделении памяти под двумерный массив
#include &lt;iostream&gt; using namespace std; class array { int size1, size2; char **matr; public: array(int n1, int n2); ...

Выравнивание при динамическом выделении памяти под массив
Добрый вечер. Для того, чтобы выделить память под массив динамически и выровнять указатель по 16 байтам, в разных ОС существуют разные...

Ошибка при выделении памяти под вектор методом resize
Всем добрый день! Возник следующий вопрос: выделяю память для вектора с помощью метода resize(w*h). Затем мне нужно на место с определенным...

6
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
14.04.2015, 16:39
гига этоже 1024*1024*1024

Добавлено через 1 минуту
Цитата Сообщение от Pony_S Посмотреть сообщение
Решил проверить сколько всего памяти могу выделить под массив:
под виндой примерно 2Гб максимум
т.е для 3хмерного примерно 800*800*800
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
14.04.2015, 17:03
Цитата Сообщение от Pony_S Посмотреть сообщение
Размер массива перевалил за 100 ГБ, а ошибки не вылетает, почему?
Потому что память реально не выделяется. В виртуальной памяти операционкой ставится пометочка, что вот столько б памяти вашей программе хотелось бы и все. А как только программа эту память затребует, то и ошибка не заставит себя ждать.
2
0 / 0 / 0
Регистрация: 28.02.2015
Сообщений: 8
14.04.2015, 20:07  [ТС]
aLarman,
Цитата Сообщение от aLarman Посмотреть сообщение
под виндой примерно 2Гб максимум
т.е для 3хмерного примерно 800*800*800
Под один массив, который заполнит всю память? А если нужно 4 таких?

Добавлено через 2 минуты
Цитата Сообщение от SatanaXIII Посмотреть сообщение
А как только программа эту память затребует, то и ошибка не заставит себя ждать.
SatanaXIII,
Цитата Сообщение от Pony_S Посмотреть сообщение
for(int j=0;j<i;j++)
* * * * {
* * * * * * array[j]=0;
* * * * }
Разве для заполнения массива нулями память не требуется?
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
14.04.2015, 20:16
Цитата Сообщение от Pony_S Посмотреть сообщение
Размер массива перевалил за 100 ГБ
если sizeof(int) у вас равен 4, то максимум вы выделите 2 гб. далее - переполнение и по-новой.
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
15.04.2015, 09:36
Лучший ответ Сообщение было отмечено Pony_S как решение

Решение

aLarman, retmas, Pony_S, управление памятью в винде несколько гораздо сложнее, чем просто нарезка объема физической железки - планки оперативки на куски, под требование каждой программы. Есть мощнейший механизм виртуальной памяти. Есть своп. Без понимания этих механизмов трудно судить о выделении памяти под массив в вашем коде. Точнее о процессах, происходящих при выделении памяти. Вы пишите одну короткую команду new, и не задумываетесь сколько механизмов при этом начинает работать. Аллокаторы ищут память, специальные менеджеры ее разгребают, освобождают. Подменяют страницы, отображая их в одни и те же физические адреса.
То есть имея физическую планку на четыре гигабайта, можно в контексте одного процесса выделять память огромными кусками по два (а используя специальные флаги на тридцати двух битной архитектуре и по три) гигабайта некоторое число раз, что в итоге приведет к тому, что под приложение будет выделено десятки, а может и сотни, гигабайт памяти. Только использовать оно их не сможет конечно сразу все. Но захапать захапает.
1
15.04.2015, 09:39

Не по теме:

SatanaXIII, лично наблюдение :) как правило при таком выделении памяти 2Гб система дает

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.04.2015, 09:39
Помогаю со студенческими работами здесь

Программа вылетает при выделении памяти классу
Программа вылетает при выделении памяти классу и удаления ее.Использую CodeBlocks buffer::buffer() { buf = new buffer; } ...

Ошибка в выделении памяти под 3х мерный массив
Здравствуйте. Мне нужна трехмерная таблица для реализации одного метода... Мне нужна реализация для n=2. т.е смотрите. Таблица должна...

Dll вызывается, но при выделении памяти вылетает
Доброго времени суток. Столкнулся с проблемой выделением памяти в dll. Вызываю функцию: char * word = &quot;ABCDEF&quot;; ...

Программа валится при освобождении памяти под динамический массив
Доброго времени суток. Проблема такая. Моя программа представляет собой поразрядную сортировку даты вида dd.mm.yyyy, пока я тестирую только...

При освобождении памяти под двумерный динамический массив way выскакивает EAcessViolation
Здравствуйте. Помогите, пожалуйста, разобраться с такой проблемой. При освобождении памяти под двумерный динамический массив way...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru