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

Освобождается ли память? - C++

Восстановить пароль Регистрация
 
Bredorub
4 / 4 / 0
Регистрация: 16.01.2011
Сообщений: 90
23.01.2011, 14:01     Освобождается ли память? #1
Под вводимое с клавиатуры количество переменных выделяется память. Затем переменным в цикле присваивается значение.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int units, *x;
randomize();
cin >> units;
x = new int [units];
for (int i = 0; i < units; i++) {
           x[i] = random(20);
    cout << x[i] << " " << &x[i] << endl;
}
cout << endl;
delete[] x;
for (int i = 0; i < units; i++) {
    cout << x[i] << " " << &x[i] << endl;
}
Проблема в том, что цикл for после освобождения памяти выдает абсолютно то же самое что и for до delete. Стало быть, память не освобождается? Хотя синтаксис вроде верный... В общем либо я что-то не так делаю, либо чего-то недопонимаю, либо одно из двух. Буду признателен если кто подскажет.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2011, 14:01     Освобождается ли память?
Посмотрите здесь:

C++ Динамическая память
Не освобождается память при выбросе исключений C++
C++ Память
C++ Не освобождается память
C++ Динамическая память с++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
23.01.2011, 14:04     Освобождается ли память? #2
обращаться к освобожденной памяти небезопасно, но да, менеджер памяти скорее всего не будет отдавать память обратно ос сразу после ее освобождения, из соображений эффективности
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
23.01.2011, 14:09     Освобождается ли память? #3
Память освобождается, содержимое памяти не изменяется и указатель продолжает указывать на выделенный ранее кусок памяти..
Если создать второй динамический массив того же размера, он с высокой долей вероятности попадет на тот же участок памяти и будет содержать значения старого массива.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cstdlib>
 
using namespace std;
 
int main() {
  int units, *x;
  cin >> units;
  x = new int [units];
  for (int i = 0; i < units; i++) {
           x[i] = rand() % 20;
        cout << x[i] << " " << &x[i] << endl;
  }
  cout << endl;
  delete[] x;
 
  int *y = new int[units];
  for (int i = 0; i < units; i++) {
        cout << y[i] << " " << &y[i] << endl;
  }
}
Bredorub
4 / 4 / 0
Регистрация: 16.01.2011
Сообщений: 90
23.01.2011, 14:25  [ТС]     Освобождается ли память? #4
Память освобождается, содержимое памяти не изменяется и указатель продолжает указывать на выделенный ранее кусок памяти..
А как тогда удостовериться в том, что память действительно освобождается?
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
23.01.2011, 14:36     Освобождается ли память? #5
Память освобождается для дальнейшего использования после вызова delete. Эту память можно использовать сразу после освобождения. Если память не освобождается после delete, это косяк ОС.

Что же вы такое хитрое имеете в виду под "освобождением" памяти, что вам нужно в этом удостоверяться?
Попробую угадать. Если в коде программы вам нужно проверить, освободилась ли ранее выделенная память, присваивайте указателю при инициализации и сразу после удаления значение NULL. Тогда вы всегда сможете проверить, выделена ли память под указатель.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
23.01.2011, 21:34     Освобождается ли память? #6
Термин "освобождение памяти" не означает, что память должна полностью очиститься или там отправиться по почте обратно на завод. Это просто значит, что в дальнейшем эта память может использоваться под другие нужды, чем раньше (т.е. мы просто говорим, что данные, которые в памяти находились, уже не актуальны, и что мол давай, ось, распоряжайся ею, как хочешь).
Yandex
Объявления
23.01.2011, 21:34     Освобождается ли память?
Ответ Создать тему
Опции темы

Текущее время: 02:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru