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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
_Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
#1

"Очереди" - очистка памяти - C++

19.02.2010, 03:43. Просмотров 1476. Ответов 6
Метки нет (Все метки)

Привет всем, у меня возникла такая проблема, есть функция которая делает выборку из очереди:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//------------Выборка из очереди
Order *get(Order* beg){
 
    if(!beg){
        cout << "\nОчередь пуста";
        return 0;
    }
    print(*beg);
    //delete beg;
    beg = beg->next;
    return beg;
 
}
где "beg" - указатель на начало очереди, получается что при выборке тут(пример из практикума Павловской) просто изменяется указатель "beg" на указатель след. структуры. Под структуры память выделялась из кучи. Изменив указатель - память ведь не освободиться. Вообщем попробовал использовать оператор delete beg; и при второй выборки из очереди вывалилась ошибка :
Unhandled exception at 0x102b19dc (msvcr80d.dll) in moe.exe: 0xC0000005: Access violation reading location 0xfeeeff6a. Заранее спасибо всем отозвавшимся
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2010, 03:43     "Очереди" - очистка памяти
Посмотрите здесь:

C++ "Очереди" как сделать?
C++ что значит "поставить контроль памяти"? (в динамическом массиве)
C++ напишите программу! тема "динамическое распределение памяти"!
Поиск значения в памяти приложения ("Нет" читам!) C++
C++ очистка экрана system("cls")
C++ Можно ли получить адрес памяти где хранится буква "a"
Ошибка "чтение памяти невозможно" во время перехода к строке с функцией C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
19.02.2010, 03:49     "Очереди" - очистка памяти #2
_Eldar_, тут посмотрите
_Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
19.02.2010, 03:56  [ТС]     "Очереди" - очистка памяти #3
Понял. Надо было было через временный указатель сделать. Но все равно не понятно. Оператор delete ведь не удаляет сам указатель, а освобождает память на которую он указывал.
C++
1
2
3
4
5
6
7
8
9
10
11
12
//------------Выборка из очереди
Order *get(Order* beg){
    if(!beg){
        cout << "\nОчередь пуста";
        return 0;
    }
    print(*beg);
    Order *temp = beg->next;
    delete beg;
    beg = temp;
    return beg;
}
Добавлено через 1 минуту
сорри, забыл тег СРР поставить
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
19.02.2010, 04:12     "Очереди" - очистка памяти #4
Цитата Сообщение от _Eldar_ Посмотреть сообщение
C++
1
2
3
Order *temp = beg->next; // temp указывает на следующий за *beg объект
delete beg; // освобождается память на которую указывает beg
beg = temp; // beg указывает на следующий объект (теперь первый в очереди)
Да вроде всё правильно... А что смущает?
Когда уничтожится последний объект, функция вернёт NULL, надо этот момент отслеживать.
_Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
19.02.2010, 04:24  [ТС]     "Очереди" - очистка памяти #5
easybudda, смущает использование временного указателя,
C++
1
2
delete beg; // очистил память на которую указывает beg
beg = beg->next; // присвоил новое значение указателю beg
delete beg; - ведь не удаляет самого указателя
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
19.02.2010, 04:39     "Очереди" - очистка памяти #6
Цитата Сообщение от _Eldar_ Посмотреть сообщение
beg = beg->next;
вот так как-раз нельзя делать! после delete beg; никакого beg->next уже не будет! Для того временная переменная-указатель и нужна.
удаляется объект, на который указывал beg, получить значение переменной удалённого объекта не получится!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2010, 04:40     "Очереди" - очистка памяти
Еще ссылки по теме:

C++ Класс "ArrayList", похоже на проблему с выделением памяти
C++ "Очистка" массива wchar_t
Как сделать так, чтобы введенное с клавиатуры слово "helllo" в памяти сохранялось в виде "Hello". C++
C++ Могут ли вирусы в "мусоре" оперативной памяти извлечь что то полезное из работы других программ?
C++ Описать шаблон класса АТД: "Участник очереди на печать издания: фамилия, телефон, количество страниц"

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

Или воспользуйтесь поиском по форуму:
_Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
19.02.2010, 04:40  [ТС]     "Очереди" - очистка памяти #7
ПОНЯТНО
Yandex
Объявления
19.02.2010, 04:40     "Очереди" - очистка памяти
Ответ Создать тему
Опции темы

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