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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
#1

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

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

Предположим, применяется оператор new в форме для массива:
C++
1
p=new int [n];
. n ведь может быть и большим. Может n==1000000? Где запоминается, сколько выделено памяти и откуда система знает, сколько надо освободить памяти по
C++
1
delete [] p;
? Ведь там то я n не указываю. Может надо освободить сразу много страниц? Освобождаются все страницы, расположенные подряд? Эйси. А если я сначала выделили две страницы, а потом ещё три и все пять оказались подряд? А освобождаю сначала две? За счёт чего система заберёт только первую страницу, а не все пять? Или они не могут быть подряд?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2012, 06:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Теория по динамической памяти (C++):

Освобождение динамической памяти в vs - C++
Вообщем попался я тут, и так, код: //#define _CRT_SECURE_NO_WARNINGS добавить в vs #include <iostream> #include <stdlib.h> ...

выделение динамической памяти - C++
помогите пожалуйста , нужно написать функцию для ввода новой матрицы, не получается выделить под него память. класс: mymatrix ::...

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

Выделение динамической памяти - C++
Добрый вечер. Помогите разобраться пожалуйста! Суть такова: есть файл, в нем есть данные, мне надо их оттуда считать и вывести на...

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

Выделение динамической памяти C++ - C++
Всем доброго времени суток. Вот столкнулся с проблемой и пока что не приходит ничего интересного по поводу её решения. есть у меня метод,...

41
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
13.12.2012, 19:06  [ТС] #31
Вот только терминальный ноль мне объяснять не надо. Речь не о фокусах прилады, а о том, как учёт памяти ведёт сторонний код.
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.12.2012, 19:09 #32
Цитата Сообщение от taras atavin Посмотреть сообщение
То есть память выделяется в два этапа? Тогда как ведёт себя gcc на винде?
Использует аллокатор из msvcrt.dll (gcc из MinGW, как минимум)
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
13.12.2012, 19:14  [ТС] #33
Я перепутал, как делится адрес. В страницу помещается 4096 чаров, перерасход в 128 раз, а чтоб выйти по памяти надо четверть миллиарда массивов по 32.

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

Цитата Сообщение от taras atavin Посмотреть сообщение
том, как учёт памяти ведёт сторонний код.
А кто его знает как, запоминает где то
зависит и от компилятора и от системы и от архитектуры железа
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
13.12.2012, 19:18  [ТС] #35
AMD 64, винда x64, а компил 32-х битный.
0
activnaya
255 / 45 / 2
Регистрация: 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
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 2
13.12.2012, 19:20 #37
помогите,модуль по информатике у меня завтра,сама сделать не могу....выполнить сортировку элементов двумерного массива,расположенных на главной диагонали.результат вывести на экран
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.12.2012, 19:22 #38
Цитата Сообщение от taras atavin Посмотреть сообщение
И как он себя ведёт?
Вот как только Microsoft выложит его исходники, так и скажу.
1
dasha00000
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 2
13.12.2012, 19:22 #39
taras atavin, выполнить сортировку элементов двумерного массива,расположенных на главной диагонали.результат вывести на экран
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,242
13.12.2012, 19:33 #40
Цитата Сообщение от activnaya Посмотреть сообщение
Где это видно чтобы статический массив изменял размер?
А никто и не говорит что он изменяет размер во время работы
просто дописывая/ правя программу я могу изменить размер массива и мне придется править весь код если не воспользуюсь
C++
1
sizeof(a) / sizeof(a[0])
Цитата Сообщение от activnaya Посмотреть сообщение
Эти заморочки с sizeof()'ами только для удобства поддержки кода.
вот именно
Цитата Сообщение от activnaya Посмотреть сообщение
И то, лучше уж дефайнить размер чем мутить sizeof'ы.
не возбраняется
в каждой палатке свои порядки
0
aLarman
643 / 564 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
14.12.2012, 18:06 #41
Цитата Сообщение от Vourhey Посмотреть сообщение
Если запускать его в студии, то я бы поменял вот так:
Код C++
1
2
3
4
5
int *pInt;
pInt = new int[10];
for(int i=0;i<10;i++)
pInt[i]=i;
cout<<*(pInt-4)<<endl;
И вывод - 40. Что и есть 10 * размер int. Если поменяю на:
Код C++
1
pInt = new int[128];
То вывод - 512
хм, неплохо только не понял почему
C++
1
cout<<*(pInt-4)<<endl;
получается мы сместились влево на 4*sizeof(int) байт, почему именно столько

Добавлено через 4 минуты
а на сколько надо для double смещатся? 1,2,4,8,16,32,64 не подходят)

Добавлено через 16 минут
разобрался уже, вот это спасло)
C++
1
cout<<(int)*((int*)pInt-4)<<endl;
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,242
14.12.2012, 19:58 #42
Цитата Сообщение от aLarman Посмотреть сообщение
хм, неплохо
ага
только проверено, только в студии
завтра микрософт поменяет идеологию выделения памяти, куда девать все исходники?
в общем использование "хакерских методов" имеет место быть для конкретной вещи, но рекомендовать "на века" не стал бы
1
14.12.2012, 19:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2012, 19:58
Привет! Вот еще темы с ответами:

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

Переменные в динамической памяти! - C++
подскажите как реализовать такое задание: Разместите в динамической памяти две переменные типа структура, содержащую информацию о...

Матрица в динамической памяти - C++
Здраствуйте,начал проходить динамическую память ,так немогу зделать 2-х мерный массив,помогите пожалуисто разобраться ,ии какие ошибки тут...

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


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

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

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