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

С++ для начинающих

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

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

26.03.2011, 13:02. Просмотров 5143. Ответов 38
Метки нет (Все метки)

Здравствуйте.

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

Дано
Разные персональные компьютеры:
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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2011, 13:02     Операторы динамического выделения памяти - new/delete
Посмотрите здесь:
Применение Динамического выделения памяти C++
По поводу динамического выделения памяти C++
C++ Функциии динамического выделения и освобождения памяти
Как написать программу для динамического выделения памяти с использованием new C++
C++ Сумма элементов первой и последней строчки матрицы с использованием динамического выделения памяти
C++ Реализовать «массив целых чисел». Обработать ошибки динамического выделения памяти. Переопределить опе
delete динамического массива символов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
26.03.2011, 16:10     Операторы динамического выделения памяти - new/delete
  #16

Не по теме:

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

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

Добавлено через 1 минуту
С учётом того, что в Си++ нет встроенного аналога для realloc'а, использование malloc'а зачастую остаётся единственным вразумительным способом
slice
34 / 77 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 16:26     Операторы динамического выделения памяти - new/delete #20
Цитата Сообщение от Evg Посмотреть сообщение
С учётом того, что в Си++ нет встроенного аналога для realloc'а, использование malloc'а зачастую остаётся единственным вразумительным способом
Ты случайно не знаешь, как ведет себя вектор при ресайзе? Получим ли мы эффект аналогичный реалоку(если есть возможность то блок памяти просто расширяется без копирования на новое место)?
Evg
Эксперт CАвтор FAQ
17546 / 5784 / 370
Регистрация: 30.03.2009
Сообщений: 15,931
Записей в блоге: 26
26.03.2011, 17:01     Операторы динамического выделения памяти - new/delete #21
Цитата Сообщение от slice Посмотреть сообщение
Ты случайно не знаешь, как ведет себя вектор при ресайзе?
А что, вектор уже стал встроенной конструкцией C++?
slice
34 / 77 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 17:26     Операторы динамического выделения памяти - new/delete #22
Evg, Что ты подразумеваешь под встроенной конструкцией языка?
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
26.03.2011, 17:34     Операторы динамического выделения памяти - new/delete #23
Цитата Сообщение от Evg Посмотреть сообщение
А что, вектор уже стал встроенной конструкцией C++?
не менее встроенная чем malloc
slice
34 / 77 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 17:36     Операторы динамического выделения памяти - new/delete #24
alex_x_x, вот и я об этом же подумал.
Evg, на вопрос про вектор сможешь ответить?
Evg
Эксперт CАвтор FAQ
17546 / 5784 / 370
Регистрация: 30.03.2009
Сообщений: 15,931
Записей в блоге: 26
26.03.2011, 17:39     Операторы динамического выделения памяти - new/delete #25
Цитата Сообщение от slice Посмотреть сообщение
Evg, Что ты подразумеваешь под встроенной конструкцией языка?
А к чему ты спросил про вектор, когда речь шла об отсутствии встроенной конструкции, являющейся аналогом аналога?

Цитата Сообщение от slice Посмотреть сообщение
Evg, на вопрос про вектор сможешь ответить?
Да куда уж мне. Это ведь твой интеллектуальный вклад в данную тему кто-то оценил, а не мой
slice
34 / 77 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 18:13     Операторы динамического выделения памяти - new/delete #26
Цитата Сообщение от Evg Посмотреть сообщение
А к чему ты спросил про вектор, когда речь шла об отсутствии встроенной конструкции, являющейся аналогом аналога?
я спросил о возможности использования метода ресайз у вектора как алтернативу реалока. Слова "встроенная конструкция" я не заметил.


Цитата Сообщение от Evg Посмотреть сообщение
аналогом аналога
интересная речевая конструкция, ниразу такую не встречал



Цитата Сообщение от Evg Посмотреть сообщение
Да куда уж мне. Это ведь твой интеллектуальный вклад в данную тему кто-то оценил, а не мой
К сожалению этот кто-то передумал и вернул все как было. А если серьезно, ты можешь ответить нормально, без увертываний?
Evg
Эксперт CАвтор FAQ
17546 / 5784 / 370
Регистрация: 30.03.2009
Сообщений: 15,931
Записей в блоге: 26
26.03.2011, 18:34     Операторы динамического выделения памяти - new/delete #27
Цитата Сообщение от slice Посмотреть сообщение
я спросил о возможности использования метода ресайз у вектора как алтернативу реалока
А ты и в правду считаешь, что это альтернатива реаллоку?

Цитата Сообщение от slice Посмотреть сообщение
А если серьезно, ты можешь ответить нормально, без увертываний?
Могу, но зачем? Мы ж вроде как бессмысленно препираемся
slice
34 / 77 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 18:40     Операторы динамического выделения памяти - new/delete #28
Цитата Сообщение от Evg Посмотреть сообщение
А ты и в правду считаешь, что это альтернатива реаллоку?
да


Цитата Сообщение от Evg Посмотреть сообщение
Могу, но зачем? Мы ж вроде как бессмысленно препираемся
препираться мне надоело
Evg
Эксперт CАвтор FAQ
17546 / 5784 / 370
Регистрация: 30.03.2009
Сообщений: 15,931
Записей в блоге: 26
26.03.2011, 18:54     Операторы динамического выделения памяти - new/delete #29
То, что возвращает malloc/realloc - это сплошной участок памяти. Эту память действительно можно использовать произвольным образом. То, что работает через контейнер vector - оно только внешне выглядит как сплошной участок. На самом деле это фрагментированные куски памяти, а оператор [] возвращает указатель на нужную запись путём вычисления, в котором из фрагментов находится участок. То, что тебе выдало malloc, грубо говоря, можно копировать через memcpy, а с вектором - нельзя. Обращение к элементу памяти от malloc'а по индексу делается за константное количество операций (адрес + индекс помноженный на sizeof), а обращение к элементу в vector'е - это вычисления. vector - это, грубо говоря, то, о чём написано в конце поста #5
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2011, 19:05     Операторы динамического выделения памяти - new/delete
Еще ссылки по теме:
C++ Правильное удаление двумерного динамического массива ( нужен ли delete[] array )
delete[] *pointer vs. delete pointer и утечка памяти C++
C++ Динамическое выделения памяти
C++ Ошибка выделения памяти...
C++ Ожидание выделения памяти

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

Или воспользуйтесь поиском по форуму:
slice
34 / 77 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 19:05     Операторы динамического выделения памяти - new/delete #30
Evg
Я надеюсь ты не шутишь.
Если нет, то ты чертовски заблуждаешься. В векторе все элементы хранятся сподряд. Можно без проблем взять указатель на нулевой элемент и обращаться к другим элементам, прибавляя оффсет.
Yandex
Объявления
26.03.2011, 19:05     Операторы динамического выделения памяти - new/delete
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru