Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
1

Теория по динамической памяти

13.12.2012, 06:06. Показов 2530. Ответов 41
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Предположим, применяется оператор new в форме для массива:
C++
1
p=new int [n];
. n ведь может быть и большим. Может n==1000000? Где запоминается, сколько выделено памяти и откуда система знает, сколько надо освободить памяти по
C++
1
delete [] p;
? Ведь там то я n не указываю. Может надо освободить сразу много страниц? Освобождаются все страницы, расположенные подряд? Эйси. А если я сначала выделили две страницы, а потом ещё три и все пять оказались подряд? А освобождаю сначала две? За счёт чего система заберёт только первую страницу, а не все пять? Или они не могут быть подряд?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2012, 06:06
Ответы с готовыми решениями:

Освобождение динамической памяти
После первого вызова функции(при повторном) пишет ошибку. В функции sort один из элементов массива...

Вопрос по динамической памяти
мне надо создать масив содержащий структуры. У меня вот код какой: vec *fild;//vec это...

Удаление new из динамической памяти
Здравствуйте, у меня есть следующее присвоение: sign->numb = new int; Мне нужно от него...

Освобождение динамической памяти
Здравствуйте! Была задача реализовать сложение длинных чисел с помощью стеков. Сам стек...

41
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
13.12.2012, 18:25 21
Author24 — интернет-сервис помощи студентам
Это, вы не путайте выделение виртуальной памяти процессам и выделение памяти прикладным программам. За первое отвечает ОС, за второе — аллокатор конкретного рантайма, который линкуется к собираемой программе. ОС обычно выделяет память или сразу страницами, или из одной или нескольких куч. А конкретный аллокатор (читай: реализация operator new/malloc) уже сама распиливает выданную виртуальную память на кусочки, ведёт учёт выданных байтиков, возвращает память обратно ОС и так далее.
1
425 / 390 / 113
Регистрация: 21.09.2012
Сообщений: 913
13.12.2012, 18:27 22
Цитата Сообщение от ValeryS Посмотреть сообщение
я вообще то всегда так делал
Но ведь это подходит для статического массива, а для динамического уже нет

taras atavin,
C++
1
std::cout << i << ", " << p[i] << ", " << (unsigned int)*((int*)p-4) / sizeof(p[0]);
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
13.12.2012, 18:30 23
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
Но ведь это подходит для статического массива, а для динамического уже нет
это почему еще???
0
425 / 390 / 113
Регистрация: 21.09.2012
Сообщений: 913
13.12.2012, 18:38 24
Цитата Сообщение от ValeryS Посмотреть сообщение
это почему еще???
C++
1
2
3
4
5
int *a;
a = new int[20];
 
cout << sizeof(a) << endl;      // 4!
cout << sizeof(a[0]) << endl;   // 4
Как узнать размер динамического массива если sizeof(a) и sizeof(a[0]) одно и тоже число показывают?
0
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
13.12.2012, 18:39 25
sizeof(a) / sizeof(a[0]) по моему глупо. Учитывая что массив статический: 1. мы знаем его размер, 2. мы знаем тип данных. И все равно продолжаем заниматься ерундой с макросами sizeof().
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
13.12.2012, 18:45 26
v.a.l.i.d,
был не прав, признаю
видать не сталкивался с этим
потому что если я выделяю память то знаю сколько и чего
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
13.12.2012, 18:51  [ТС] 27
То есть память выделяется в два этапа? Тогда как ведёт себя gcc на винде?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
13.12.2012, 18:51 28
Цитата Сообщение от activnaya Посмотреть сообщение
sizeof(a) / sizeof(a[0]) по моему глупо. Учитывая что массив статический: 1. мы знаем его размер, 2. мы знаем тип данных.
а размер то мы знаем но не всегда подсчитать можем
например
C++
1
int a[]={12,15,34,45}
и во всех циклах обращениях мы вбиваем 4
но потом данные увеличились дописали в программку
C++
1
int a[]={12,15,34,45,6,78}
мне придется пройти по всей программе и поменять 4 на 6
и вот здесь
C++
1
sizeof(a) / sizeof(a[0])
выручает
а таблицы могут быть по несколько страниц и что количество элементов на пальцах считать?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
13.12.2012, 18:52  [ТС] 29
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
Как узнать размер динамического массива если sizeof(a) и sizeof(a[0]) одно и тоже число показывают?
Не совсем. sizeof(a) покажет размер указателя, то есть разрядность системы, выраженную в байтах.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
13.12.2012, 18:57 30
v.a.l.i.d,
я сейчас понял почему не работает для динамики
sizeof расчитавает размер на этапе компиляции ( подсмотрел листинг ассемблерный)
а на этапе компиляции размер неизвестен( посему дает размер указателя)
выход: запоминай размер

есть еще один способ
выделяем память на 2 элемента(1 элемент) больше
и в начале и в конце (или только в конце) записываем маркер значение которое никогда не будет присвоено
и потом в цикле ищем этот маркер
в частности так ищется длинна строк( ищем 0)
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
13.12.2012, 19:06  [ТС] 31
Вот только терминальный ноль мне объяснять не надо. Речь не о фокусах прилады, а о том, как учёт памяти ведёт сторонний код.
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
13.12.2012, 19:09 32
Цитата Сообщение от taras atavin Посмотреть сообщение
То есть память выделяется в два этапа? Тогда как ведёт себя gcc на винде?
Использует аллокатор из msvcrt.dll (gcc из MinGW, как минимум)
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
13.12.2012, 19:14  [ТС] 33
Я перепутал, как делится адрес. В страницу помещается 4096 чаров, перерасход в 128 раз, а чтоб выйти по памяти надо четверть миллиарда массивов по 32.

Добавлено через 2 минуты
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Использует аллокатор из msvcrt.dll (gcc из MinGW, как минимум)
И как он себя ведёт?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
13.12.2012, 19:17 34
Цитата Сообщение от taras atavin Посмотреть сообщение
Вот только терминальный ноль мне объяснять не надо.
а я и не тебе, я v.a.l.i.dу

Цитата Сообщение от taras atavin Посмотреть сообщение
том, как учёт памяти ведёт сторонний код.
А кто его знает как, запоминает где то
зависит и от компилятора и от системы и от архитектуры железа
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
13.12.2012, 19:18  [ТС] 35
AMD 64, винда x64, а компил 32-х битный.
0
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
13.12.2012, 19:19 36
Цитата Сообщение от ValeryS Посмотреть сообщение
а размер то мы знаем но не всегда подсчитать можем
например
C++
1
int a[]={12,15,34,45}
и во всех циклах обращениях мы вбиваем 4
но потом данные увеличились дописали в программку
C++
1
int a[]={12,15,34,45,6,78}
мне придется пройти по всей программе и поменять 4 на 6
и вот здесь
C++
1
sizeof(a) / sizeof(a[0])
выручает
а таблицы могут быть по несколько страниц и что количество элементов на пальцах считать?
ЩИТО? Где это видно чтобы статический массив изменял размер?А если это VLA, то размер мы знаем. Эти заморочки с sizeof()'ами только для удобства поддержки кода. И то, лучше уж дефайнить размер чем мутить sizeof'ы.
1
dasha00000
13.12.2012, 19:20 37
помогите,модуль по информатике у меня завтра,сама сделать не могу....выполнить сортировку элементов двумерного массива,расположенных на главной диагонали.результат вывести на экран
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
13.12.2012, 19:22 38
Цитата Сообщение от taras atavin Посмотреть сообщение
И как он себя ведёт?
Вот как только Microsoft выложит его исходники, так и скажу.
1
dasha00000
13.12.2012, 19:22 39
taras atavin, выполнить сортировку элементов двумерного массива,расположенных на главной диагонали.результат вывести на экран
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
13.12.2012, 19:33 40
Цитата Сообщение от activnaya Посмотреть сообщение
Где это видно чтобы статический массив изменял размер?
А никто и не говорит что он изменяет размер во время работы
просто дописывая/ правя программу я могу изменить размер массива и мне придется править весь код если не воспользуюсь
C++
1
sizeof(a) / sizeof(a[0])
Цитата Сообщение от activnaya Посмотреть сообщение
Эти заморочки с sizeof()'ами только для удобства поддержки кода.
вот именно
Цитата Сообщение от activnaya Посмотреть сообщение
И то, лучше уж дефайнить размер чем мутить sizeof'ы.
не возбраняется
в каждой палатке свои порядки
0
13.12.2012, 19:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2012, 19:33
Помогаю со студенческими работами здесь

Вопросы по динамической памяти.
У меня вопросы по работе с динамической памятью. Пожалуйста, помогите разобраться с этой темой. -...

Выделение динамической памяти
Ситуация заключается в следующем я выделил память под двумерный массив, но получилось так что мне...

Освобождение динамической памяти
Добрый день, объясните, пожалуйста, как правильно удалять выделенную динамическую память? Вот...

Удаление динамической памяти
Всем здрасьте. Имеется вот такая структура. struct ModelType { DWORD FVF;...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru