Форум программистов, компьютерный форум CyberForum.ru

Операторы динамического выделения памяти - new/delete - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.95
KBEPTMEH
0 / 0 / 0
Регистрация: 26.03.2011
Сообщений: 12
26.03.2011, 13:02     Операторы динамического выделения памяти - new/delete #1
Здравствуйте.

Я немного не понимаю некоторый момент, связанный с динамическим выделением памяти, а именно - с объемом выделяемой памяти.

Дано
Разные персональные компьютеры:
1. Win XP Pro SP3 32bit - 2 Gb RAM;
2. Win XP Pro SP3 32bit - 3 Gb RAM;
3. Win Server 2003 64 bit - 8 Gb RAM.

Задача
Динамически выделить крупный "кусок" RAM (1 Gb и более), а именно - создать массив типа структура.

Мое решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/* Общий размер структуры = 20 Байт */
struct my_struct 
{
  long int f0;
  long int f1;
  long int f2;
  long int f3;
  long int f4;
}
 
my_struct *p_my_array;
 
/* Пытаюсь выделать 20 * 30000000 Байт */
try 
{
  p_my_array = new my_struct[30000000];  
} catch (bad_alloc) { /* Обработка исключения в случае неудачи при выделении памяти */ }
 
/*
...
Ряд действий
...
*/
 
delete [] p_my_array;
Проблема
Ни на одном из трех указанных выше ПК - не получается выделить объем памяти более 512 МБайт.
В момент попытки динамического выделения памяти - ОС и все запущенное ПО потребляет не более 700 МБайт.
То есть всегда свободно достаточное количество памяти, чтобы можно было ею воспользоваться.
(В приведенном примере производится попытка выделения памяти объемом больше 512 МБайт).

Вопрос
1. Возможно ли вообще выделать больше 512 Мбайт памяти динамически или нет?
2. Можно ли заставить программу "кушать" всю свободную оперативную память и соответственно манипулировать всей свободной оперативной памятью в системе? (К примеру 8 Gb RAM).
3. На сколько я знаю, в С++ рациональнее пользоваться операторами new/delete, вместо функций malloc()/free(). Это правда?

Пост Скриптум
Не спрашивайте зачем так много программе нужно оперативки. Просто нужно

Всем заранее спасибо за Ваши ответы и подсказки.
С уважением.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
26.03.2011, 13:09     Операторы динамического выделения памяти - new/delete #2
Цитата Сообщение от KBEPTMEH Посмотреть сообщение
1. Возможно ли вообще выделать больше 512 Мбайт памяти динамически или нет?
2. Можно ли заставить программу "кушать" всю свободную оперативную память и соответственно манипулировать всей свободной оперативной памятью в системе? (К примеру 8 Gb RAM).
Это зависит не от языка программирования, а от настроек операционной системы. Ради интереса проверь, получится ли выделить два раза по 512 мегов (а не гиг за раз)

Цитата Сообщение от KBEPTMEH Посмотреть сообщение
3. На сколько я знаю, в С++ рациональнее пользоваться операторами new/delete, вместо функций malloc()/free(). Это правда?
Если исходить из позиции "рациональнее", то не правда, ибо разницы нет (ну разве что через new будет чуток больше памяти отжираться)

Добавлено через 3 минуты
И попробуй ещё malloc'ом напрямую (т.е. без new) выделить более 512 гигов. А то запрет может быть в том числе и в библиотеке run-time поддержки Си++. new внутри себя всё равно через malloc работает. Под unix'ом чтобы выделить очень много памяти, то нужно работать через mmap вместо malloc'а (хотя некоторые реализации malloc'а умеют работать с mmap), возможно, что под виндами есть тоже какой-нибудь вызов в WinAPI. Ну и, к слову, malloc под виндами внутри себя тоже работает через WinAPI.
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 13:12     Операторы динамического выделения памяти - new/delete #3
Цитата Сообщение от Evg Посмотреть сообщение
ну разве что через new будет чуток больше памяти отжираться
с чем это связано?
KBEPTMEH
0 / 0 / 0
Регистрация: 26.03.2011
Сообщений: 12
26.03.2011, 13:31  [ТС]     Операторы динамического выделения памяти - new/delete #4
Цитата Сообщение от Evg Посмотреть сообщение
Это зависит не от языка программирования, а от настроек операционной системы. Ради интереса проверь, получится ли выделить два раза по 512 мегов (а не гиг за раз)
Да, получается выделить 1 Gb кусками по 512 Mb.

Хм. А если у меня 1 массив типа структура будет иметь размер 1 Gb или выше?
Как в этом случае правильно выделать 1 Gb памяти и потом манипулировать этим массивом?
Это получается мне нужно "дробить" 1 структуру на 2 и 1 массив на 2 массива и потом распределять память между этими массивами?
Но у меня размер массивов всегда будет постепенно увеличиваться, а следовательно - потребуется больше оперативной памяти под все это добро...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
26.03.2011, 13:37     Операторы динамического выделения памяти - new/delete #5
Цитата Сообщение от slice Посмотреть сообщение
с чем это связано?
Пишется какая-то воспомогательная информация. При вызове malloc'а, например, рядом с выделенной памятью выделяется ещё небольшой кусочек, в котором записан размер выделенной памяти, чтобы free знал, сколько нужно освобождать. В случае с new возможно есть какая-то информация уровня Си++ (а может её и нет, фиг знает).

Цитата Сообщение от KBEPTMEH Посмотреть сообщение
Хм. А если у меня 1 массив типа структура будет иметь размер 1 Gb или выше?
Как в этом случае правильно выделать 1 Gb памяти и потом манипулировать этим массивом?
Это получается мне нужно "дробить" 1 структуру на 2 и 1 массив на 2 массива и потом распределять память между этими массивами?
Но у меня размер массивов всегда будет постепенно увеличиваться, а следовательно - потребуется больше оперативной памяти под все это добро...
Выделять массив пулами не более чем в 512 мегов размером. Иметь список таких пулов. Т.е. завести некий класс "массив" и операции для индексации массива, в которых в зависимости от индекса обращаться в тот или иной пул. Дополнительных расходов по памяти будет мизер на фоне основной памяти
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 13:44     Операторы динамического выделения памяти - new/delete #6
Цитата Сообщение от Evg Посмотреть сообщение
В случае с new возможно есть какая-то информация уровня Си++ (а может её и нет, фиг знает).
Ага, здесь еще стоит вспомнить про placement new, которому надо подавать буфер памяти, без разницы где и каким образом выделенный, размером в точности sizeof создаваемого класса)))

Добавлено через 1 минуту
Я это к чему. Даже если новичек задающий вопрос не заострит внимания на каких-либо тонкостях, то это не значит, что можно бросать слова на ветер.
KBEPTMEH
0 / 0 / 0
Регистрация: 26.03.2011
Сообщений: 12
26.03.2011, 13:45  [ТС]     Операторы динамического выделения памяти - new/delete #7
Цитата Сообщение от Evg Посмотреть сообщение
Выделять массив пулами не более чем в 512 мегов размером. Иметь список таких пулов. Т.е. завести некий класс "массив" и операции для индексации массива, в которых в зависимости от индекса обращаться в тот или иной пул. Дополнительных расходов по памяти будет мизер на фоне основной памяти
Эх, мои самые страшные опасения на сей счет - оказались реальностью
Большое спасибо за ответы и советы, придется работать именно так.

Но если у кого-то есть более интересный вариант решения данной проблемы - я буду очень рад, если Вы наставите newbie на путь истинный

Спасибо еще раз
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
26.03.2011, 13:50     Операторы динамического выделения памяти - new/delete #8
Цитата Сообщение от slice Посмотреть сообщение
то это не значит, что можно бросать слова на ветер
Тебе вот чисто попрепираться на ровном месте хочется или чего? Ну докажи тогда, что использовать new рациональнее, чем malloc
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 13:58     Операторы динамического выделения памяти - new/delete #9
Evg
я же уже написал! что есть модификация оператора new - placement new. Память под который подаешь ты сам (хоть тем же malloc-ом выдели, хоть со стека кусок). И я знаю, что подавать надо буфер размером sizeof класса, не больше не меньше! То есть никакой дополнительной информации о классе не надо.
Обычный new, естественно, еще выделяет несколько байт, чтоб запомнить размер буфера. Т.е. он ничем не хуже malloc-а.
Теперь понятно?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
26.03.2011, 14:08     Операторы динамического выделения памяти - new/delete #10
slice, я тебя не просил доказывать, что new ничем не хуже malloc'а (да я и не утверждал обратного). Я тебя просил доказать, что использование new рациональнее, чем malloc. Ибо я утверждал, что верно обратное, после чего ты начал выступать про "бросать слова на ветер"

Добавлено через 2 минуты
Ну и так, на всякий случай. Речь шла о выделении памяти, а placement new не занимается выделением памяти
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 14:25     Операторы динамического выделения памяти - new/delete #11
Тогда что ты имел ввиду здесь?
Цитата Сообщение от Evg Посмотреть сообщение
ну разве что через new будет чуток больше памяти отжираться
Добавлено через 15 минут
Цитата Сообщение от Evg Посмотреть сообщение
Я тебя просил доказать, что использование new рациональнее, чем malloc. Ибо я утверждал, что верно обратное
Нет, ты утверждал, что new отжирает чуток больше памяти, а значит мне достаточно доказать, что new по крайней мере не хуже.


Цитата Сообщение от Evg Посмотреть сообщение
Ну и так, на всякий случай. Речь шла о выделении памяти, а placement new не занимается выделением памяти
Я в курсе, что такое placement new. Я привел его в пример чтоб показать, что если для создания класса на заранее выделенной памяти достаточно sizeof байт, то с какой стати ситуация поменяется, когда память выделяет оператор new.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
26.03.2011, 14:37     Операторы динамического выделения памяти - new/delete #12
Цитата Сообщение от slice Посмотреть сообщение
что если для создания класса на заранее выделенной памяти достаточно sizeof байт, то с какой стати ситуация поменяется, когда память выделяет оператор new
Я же писал, что "В случае с new возможно есть какая-то информация уровня Си++ (а может её и нет, фиг знает)". Точно так же, что если ты вызываешь malloc (100), то выделится у тебя не 100 байт, а немного больше (и это абсолютно точно). Тонкости про то, что память выделяется с точностью до четырёхкилобайтной страницы, понятное дело, опускаем. Утверждать что-то наверняка по части того, оператор new не выделяет лишнюю память можно только тогда, когда увидишь исходники нескольких реализаций оператора new из run-time поддержки существующих компиляторов и увидишь, что во всех случаях new является строгой надстройкой над malloc'ом

К чему был вспомнен placement new в теме про динамическое выделение памяти - я не знаю.
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 14:57     Операторы динамического выделения памяти - new/delete #13
Цитата Сообщение от Evg Посмотреть сообщение
К чему был вспомнен placement new в теме про динамическое выделение памяти - я не знаю.
я уже писал к чему. Для того чтоб показать, что никакой мифической "информации уровня Си++" нет.

В прочем, ты можешь продолжать считать, что разработчики С++ идиоты, обожающие сорить памятью.
Главное, не пытайся убедить в этом других.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
26.03.2011, 15:08     Операторы динамического выделения памяти - new/delete #14
Цитата Сообщение от slice Посмотреть сообщение
В прочем, ты можешь продолжать считать, что разработчики С++ идиоты
Есть, сэр
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 16:00     Операторы динамического выделения памяти - new/delete #15
вот и договорились =)

Добавлено через 1 минуту
Кстати вчера у меня была репутация минус 29, а сейчас уже минус 25. Возможно, модераторы повысили ее за мой интелектуальный вклад в развитие форума. И наиболее вероятно за этот топик.
fasked
26.03.2011, 16:10
  #16

Не по теме:

Цитата Сообщение от slice Посмотреть сообщение
Кстати вчера у меня была репутация минус 29, а сейчас уже минус 25. Возможно, модераторы повысили ее за мой интелектуальный вклад в развитие форума. И наиболее вероятно за этот топик
Вот это вряд ли

Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
26.03.2011, 16:14     Операторы динамического выделения памяти - new/delete #17
Цитата Сообщение от slice Посмотреть сообщение
Возможно, модераторы повысили ее за мой интелектуальный вклад в развитие форума
Так вот оказывается ради чего всё это делается
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
26.03.2011, 16:16     Операторы динамического выделения памяти - new/delete #18
Цитата Сообщение от Evg Посмотреть сообщение
Я тебя просил доказать, что использование new рациональнее, чем malloc. Ибо я утверждал, что верно обратное, после чего ты начал выступать про "бросать слова на ветер"
использовать malloc в с++ - большой грех, вот в чем дело
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
26.03.2011, 16:20     Операторы динамического выделения памяти - new/delete #19
Цитата Сообщение от alex_x_x Посмотреть сообщение
использовать malloc в с++ - большой грех, вот в чем дело
Автор спрашивал совсем о другом. Ему нужно много памяти, а грех это или не грех, его заботит в последнюю очередь

Добавлено через 1 минуту
С учётом того, что в Си++ нет встроенного аналога для realloc'а, использование malloc'а зачастую остаётся единственным вразумительным способом
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2011, 16:26     Операторы динамического выделения памяти - new/delete
Еще ссылки по теме:

C++ Сумма элементов первой и последней строчки матрицы с использованием динамического выделения памяти
По поводу динамического выделения памяти C++
Как написать программу для динамического выделения памяти с использованием new C++

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

Или воспользуйтесь поиском по форуму:
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 16:26     Операторы динамического выделения памяти - new/delete #20
Цитата Сообщение от Evg Посмотреть сообщение
С учётом того, что в Си++ нет встроенного аналога для realloc'а, использование malloc'а зачастую остаётся единственным вразумительным способом
Ты случайно не знаешь, как ведет себя вектор при ресайзе? Получим ли мы эффект аналогичный реалоку(если есть возможность то блок памяти просто расширяется без копирования на новое место)?
Yandex
Объявления
26.03.2011, 16:26     Операторы динамического выделения памяти - new/delete
Ответ Создать тему
Опции темы

Текущее время: 17:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru