Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

26.03.2011, 13:02. Просмотров 5366. Ответов 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(). Это правда?

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

Всем заранее спасибо за Ваши ответы и подсказки.
С уважением.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2011, 13:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Операторы динамического выделения памяти - new/delete (C++):

По поводу динамического выделения памяти - C++
Допустим, в программе вызывается функция SomeFunc(), описанная как void SomeFunc(){ int arr; //...do something } В...

Применение Динамического выделения памяти - C++
Надо решить задачу написав функцию. Нужно выделить память использую malloc. Помогите Плиз..! Заранее Спасибо)) Дана матрица...

Функциии динамического выделения и освобождения памяти - C++
Необходим написать функции выделения и освобождения памяти под двумерный динамический массив. Причем освобождение должн быть не сразу для...

Как написать программу для динамического выделения памяти с использованием new - C++
Надо написать прогу, которая выделяет память для структур размером в 2048 байт и обрабатывает ситуацию в случае ее нехватки. Я понятия не...

Сумма элементов первой и последней строчки матрицы с использованием динамического выделения памяти - C++
Количество строк и столбцов задается пользователем с клавиатуры. Элементы матрицы разместить в динамической памяти. Вычислить и сохранить...

Реализовать «массив целых чисел». Обработать ошибки динамического выделения памяти. Переопределить опе - C++
Реализовать класс «массив целых чисел». Обработать ошибки динамического выделения памяти. Переопределить оператор ++ для указателя на...

38
fasked
26.03.2011, 16:10     Операторы динамического выделения памяти - new/delete
  #16

Не по теме:

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

1
Evg
Эксперт CАвтор FAQ
18894 / 6851 / 498
Регистрация: 30.03.2009
Сообщений: 19,279
Записей в блоге: 30
26.03.2011, 16:14 #17
Цитата Сообщение от slice Посмотреть сообщение
Возможно, модераторы повысили ее за мой интелектуальный вклад в развитие форума
Так вот оказывается ради чего всё это делается
0
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
26.03.2011, 16:16 #18
Цитата Сообщение от Evg Посмотреть сообщение
Я тебя просил доказать, что использование new рациональнее, чем malloc. Ибо я утверждал, что верно обратное, после чего ты начал выступать про "бросать слова на ветер"
использовать malloc в с++ - большой грех, вот в чем дело
0
Evg
Эксперт CАвтор FAQ
18894 / 6851 / 498
Регистрация: 30.03.2009
Сообщений: 19,279
Записей в блоге: 30
26.03.2011, 16:20 #19
Цитата Сообщение от alex_x_x Посмотреть сообщение
использовать malloc в с++ - большой грех, вот в чем дело
Автор спрашивал совсем о другом. Ему нужно много памяти, а грех это или не грех, его заботит в последнюю очередь

Добавлено через 1 минуту
С учётом того, что в Си++ нет встроенного аналога для realloc'а, использование malloc'а зачастую остаётся единственным вразумительным способом
1
slice
35 / 78 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 16:26 #20
Цитата Сообщение от Evg Посмотреть сообщение
С учётом того, что в Си++ нет встроенного аналога для realloc'а, использование malloc'а зачастую остаётся единственным вразумительным способом
Ты случайно не знаешь, как ведет себя вектор при ресайзе? Получим ли мы эффект аналогичный реалоку(если есть возможность то блок памяти просто расширяется без копирования на новое место)?
0
Evg
Эксперт CАвтор FAQ
18894 / 6851 / 498
Регистрация: 30.03.2009
Сообщений: 19,279
Записей в блоге: 30
26.03.2011, 17:01 #21
Цитата Сообщение от slice Посмотреть сообщение
Ты случайно не знаешь, как ведет себя вектор при ресайзе?
А что, вектор уже стал встроенной конструкцией C++?
0
slice
35 / 78 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 17:26 #22
Evg, Что ты подразумеваешь под встроенной конструкцией языка?
0
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
26.03.2011, 17:34 #23
Цитата Сообщение от Evg Посмотреть сообщение
А что, вектор уже стал встроенной конструкцией C++?
не менее встроенная чем malloc
0
slice
35 / 78 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 17:36 #24
alex_x_x, вот и я об этом же подумал.
Evg, на вопрос про вектор сможешь ответить?
0
Evg
Эксперт CАвтор FAQ
18894 / 6851 / 498
Регистрация: 30.03.2009
Сообщений: 19,279
Записей в блоге: 30
26.03.2011, 17:39 #25
Цитата Сообщение от slice Посмотреть сообщение
Evg, Что ты подразумеваешь под встроенной конструкцией языка?
А к чему ты спросил про вектор, когда речь шла об отсутствии встроенной конструкции, являющейся аналогом аналога?

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


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



Цитата Сообщение от Evg Посмотреть сообщение
Да куда уж мне. Это ведь твой интеллектуальный вклад в данную тему кто-то оценил, а не мой
К сожалению этот кто-то передумал и вернул все как было. А если серьезно, ты можешь ответить нормально, без увертываний?
0
Evg
Эксперт CАвтор FAQ
18894 / 6851 / 498
Регистрация: 30.03.2009
Сообщений: 19,279
Записей в блоге: 30
26.03.2011, 18:34 #27
Цитата Сообщение от slice Посмотреть сообщение
я спросил о возможности использования метода ресайз у вектора как алтернативу реалока
А ты и в правду считаешь, что это альтернатива реаллоку?

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


Цитата Сообщение от Evg Посмотреть сообщение
Могу, но зачем? Мы ж вроде как бессмысленно препираемся
препираться мне надоело
0
Evg
Эксперт CАвтор FAQ
18894 / 6851 / 498
Регистрация: 30.03.2009
Сообщений: 19,279
Записей в блоге: 30
26.03.2011, 18:54 #29
То, что возвращает malloc/realloc - это сплошной участок памяти. Эту память действительно можно использовать произвольным образом. То, что работает через контейнер vector - оно только внешне выглядит как сплошной участок. На самом деле это фрагментированные куски памяти, а оператор [] возвращает указатель на нужную запись путём вычисления, в котором из фрагментов находится участок. То, что тебе выдало malloc, грубо говоря, можно копировать через memcpy, а с вектором - нельзя. Обращение к элементу памяти от malloc'а по индексу делается за константное количество операций (адрес + индекс помноженный на sizeof), а обращение к элементу в vector'е - это вычисления. vector - это, грубо говоря, то, о чём написано в конце поста #5
0
slice
35 / 78 / 4
Регистрация: 04.11.2010
Сообщений: 249
26.03.2011, 19:05 #30
Evg
Я надеюсь ты не шутишь.
Если нет, то ты чертовски заблуждаешься. В векторе все элементы хранятся сподряд. Можно без проблем взять указатель на нулевой элемент и обращаться к другим элементам, прибавляя оффсет.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2011, 19:05
Привет! Вот еще темы с ответами:

delete динамического массива символов - C++
Простой код вываливается с ошибкой??? #include <iostream.h> #include <string.h> int main() { char * str; str = new char;...

Правильное удаление двумерного динамического массива ( нужен ли delete[] array ) - C++
В одном из постов форума Увидев код одного из участников форума: Я пришел в замешательство, когда мне сказали, что delete arr после...

delete[] *pointer vs. delete pointer и утечка памяти - C++
Здравствуйте! Есть класс "умного" указателя counted_ptr, который удаляет хранящийся в нём T* owned; только если кол-во владельцев...

Ошибка выделения памяти... - C++
Когда я пытаюсь выделить память двумерному динамическому массиву, возникает ошибка "Microsoft C++ exception: std::bad_alloc at memory...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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