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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

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

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

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

Выделение динамической памяти - C++
Чем int *List = new int; delete List; отличается от обычного массива (int List) ? Нет, я понимаю, что создал динамическую...

Выделение динамической памяти - C++
Всем привет. Возникла задача, в которой мне необходимо знать как выделяется динамическая память средсвами new/delete. А именно,...

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
13.12.2012, 18:03     Теория по динамической памяти #16
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
Vourhey, Напишите, пожалуйста, как найти количество элементов в дин. массиве float и double. Для int вот это работает
Я вот так сделал: (под виндой, vs 2012)
C++
1
2
3
    float *pInt;
    pInt = new float[32];
    cout<<(int)*((int*)pInt-4)<<endl;
Вывод - 128

Добавлено через 6 минут
taras atavin, насколько я помню (но могу и ошибаться), то каждый последующий не "впереди" выделяется, а ищется свободный непрерывный блок памяти. Он может быть не обязательно "впереди". Но это уже, скорее, относится к менеджеру памяти конкретной ОС, а не к С++.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.12.2012, 18:04  [ТС]     Теория по динамической памяти #17
И без квадратных скобок в числителе. А прямо так даже не компилится: указатели на сайзофы не деляться.
v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
13.12.2012, 18:08     Теория по динамической памяти #18
Цитата Сообщение от taras atavin Посмотреть сообщение
Это работает со статическими.
Ну я не знаю. Сейчас делал так и все получается. Вот эта программа у меня всегда правильно результат показывает
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
#include "stdafx.h"
#include "iostream"
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
 
    unsigned int arr_size;
 
    cout << "Введите размер массива: ";
    cin >> arr_size;
 
    int *a = new int[arr_size];
 
    for (int i=0; i<arr_size; i++)
        *(a + i) = (i+1)*10;
 
    cout << "Количество элементов в динамическом массиве int: " << (int)*((int*)a-4) / sizeof(*(a+0)) << endl << endl;
 
    delete [] a;
 
    system("pause")
    return 0;
}
Извиняюсь, не то
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.12.2012, 18:11  [ТС]     Теория по динамической памяти #19
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
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
int main()
{
 int *p[16];
 char *v1;
 char *v2;
 int *b;
 int  i;
 size_t t;
 size_t n;
 size_t *s;
 std::cin>>n;
 for (i=15; i>=0; --i)
 {
  p[i]=new int [n];
 }
 for (i=15; i>=0; --i)
 {
  std::cout<<i<<", "<<p[i];
  if (i>0)
  {
   v1=(char *)p[i];
   v2=(char *)p[i-1];
   t=v2-v1;
   s=(size_t *)p[i];
   --s;
   std::cout<<", "<<t<<", "<<(t/sizeof(int))<<", "<<(*s)<< std::endl;
  }
  std::cout<<std::endl;
 }
 for (i=15; i>=0; --i)
 {
  delete [] p;
 }
 return 0;
}
В конце всех строк 1134233773. n вводил 20.

Добавлено через 1 минуту
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
*(a - sizeof(a[0])) / sizeof(a[0]) << endl;
А, там ещё звёздочка. Щас попробую.

Добавлено через 1 минуту
C++
1
std::cout<<i<<", "<<p[i]<<", "<<(*(p[i] - sizeof(p[i][0]))) / sizeof(p[i][0]);
Выводит 0.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,733
13.12.2012, 18:22     Теория по динамической памяти #20
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
"Количество элементов в динамическом массиве: " << *(a - sizeof(a[0])) / sizeof(a[0])
я вообще то всегда так делал
C++
1
sizeof(a) / sizeof(a[0])
где
sizeof(a) размер всего массива в байтах
sizeof(a[0]) размер первого элемента в байтах
можно написать так (например для double)
C++
1
sizeof(a) / sizeof(double)
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.12.2012, 18:25     Теория по динамической памяти #21
Это, вы не путайте выделение виртуальной памяти процессам и выделение памяти прикладным программам. За первое отвечает ОС, за второе — аллокатор конкретного рантайма, который линкуется к собираемой программе. ОС обычно выделяет память или сразу страницами, или из одной или нескольких куч. А конкретный аллокатор (читай: реализация operator new/malloc) уже сама распиливает выданную виртуальную память на кусочки, ведёт учёт выданных байтиков, возвращает память обратно ОС и так далее.
v.a.l.i.d
412 / 377 / 10
Регистрация: 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]);
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,733
13.12.2012, 18:30     Теория по динамической памяти #23
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
Но ведь это подходит для статического массива, а для динамического уже нет
это почему еще???
v.a.l.i.d
412 / 377 / 10
Регистрация: 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]) одно и тоже число показывают?
activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
13.12.2012, 18:39     Теория по динамической памяти #25
sizeof(a) / sizeof(a[0]) по моему глупо. Учитывая что массив статический: 1. мы знаем его размер, 2. мы знаем тип данных. И все равно продолжаем заниматься ерундой с макросами sizeof().
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,733
13.12.2012, 18:45     Теория по динамической памяти #26
v.a.l.i.d,
был не прав, признаю
видать не сталкивался с этим
потому что если я выделяю память то знаю сколько и чего
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.12.2012, 18:51  [ТС]     Теория по динамической памяти #27
То есть память выделяется в два этапа? Тогда как ведёт себя gcc на винде?
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,733
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])
выручает
а таблицы могут быть по несколько страниц и что количество элементов на пальцах считать?
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.12.2012, 18:52  [ТС]     Теория по динамической памяти #29
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
Как узнать размер динамического массива если sizeof(a) и sizeof(a[0]) одно и тоже число показывают?
Не совсем. sizeof(a) покажет размер указателя, то есть разрядность системы, выраженную в байтах.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2012, 18:57     Теория по динамической памяти
Еще ссылки по теме:

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

перераспределение динамической памяти - C++
дан двумерный массив 3х5 выделить динамически память под него, затем перераспределить ее в массив 5х3, затем удалить(выделить и удалить там...

перераспределение динамической памяти - C++
дан двумерный массив 3х5 выделить динамически память под него, затем перераспределить ее в массив 5х3, затем удалить(выделить и удалить там...

Выделение динамической памяти - C++
Доброго времени суток! я начинающий программист, столкнулась с такой проблемой: выделяю память под динамический массив, например ...

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


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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,733
13.12.2012, 18:57     Теория по динамической памяти #30
v.a.l.i.d,
я сейчас понял почему не работает для динамики
sizeof расчитавает размер на этапе компиляции ( подсмотрел листинг ассемблерный)
а на этапе компиляции размер неизвестен( посему дает размер указателя)
выход: запоминай размер

есть еще один способ
выделяем память на 2 элемента(1 элемент) больше
и в начале и в конце (или только в конце) записываем маркер значение которое никогда не будет присвоено
и потом в цикле ищем этот маркер
в частности так ищется длинна строк( ищем 0)
Yandex
Объявления
13.12.2012, 18:57     Теория по динамической памяти
Ответ Создать тему
Опции темы

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