Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
45 / 30 / 11
Регистрация: 31.10.2009
Сообщений: 200
1

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

19.02.2010, 03:43. Показов 1995. Ответов 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. Заранее спасибо всем отозвавшимся
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.02.2010, 03:43
Ответы с готовыми решениями:

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;,...

Очистка динамической памяти очереди
Доброго времени суток! Я вот думаю-думаю, но докумекать не могу. Я пишу очередь (основываюсь на...

Как сделать так, чтобы введенное с клавиатуры слово "helllo" в памяти сохранялось в виде "Hello".
Здравствуйте. Подскажите пожалауйста как сделать чтоб согда я вводу с клавиатуры helllo, в памяти...

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов), которые разделяются...

6
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11031 / 6983 / 1651
Регистрация: 25.07.2009
Сообщений: 12,727
19.02.2010, 03:49 2
_Eldar_, тут посмотрите
1
45 / 30 / 11
Регистрация: 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 минуту
сорри, забыл тег СРР поставить
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11031 / 6983 / 1651
Регистрация: 25.07.2009
Сообщений: 12,727
19.02.2010, 04:12 4
Цитата Сообщение от _Eldar_ Посмотреть сообщение
C++
1
2
3
Order *temp = beg->next; // temp указывает на следующий за *beg объект
delete beg; // освобождается память на которую указывает beg
beg = temp; // beg указывает на следующий объект (теперь первый в очереди)
Да вроде всё правильно... А что смущает?
Когда уничтожится последний объект, функция вернёт NULL, надо этот момент отслеживать.
0
45 / 30 / 11
Регистрация: 31.10.2009
Сообщений: 200
19.02.2010, 04:24  [ТС] 5
easybudda, смущает использование временного указателя,
C++
1
2
delete beg; // очистил память на которую указывает beg
beg = beg->next; // присвоил новое значение указателю beg
delete beg; - ведь не удаляет самого указателя
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11031 / 6983 / 1651
Регистрация: 25.07.2009
Сообщений: 12,727
19.02.2010, 04:39 6
Цитата Сообщение от _Eldar_ Посмотреть сообщение
beg = beg->next;
вот так как-раз нельзя делать! после delete beg; никакого beg->next уже не будет! Для того временная переменная-указатель и нужна.
удаляется объект, на который указывал beg, получить значение переменной удалённого объекта не получится!
0
45 / 30 / 11
Регистрация: 31.10.2009
Сообщений: 200
19.02.2010, 04:40  [ТС] 7
ПОНЯТНО
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.02.2010, 04:40

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование)
Разработать программу с использованием наследования классов, реализующую классы: − воин;...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания"
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс"
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об...

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления"
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс...

Определить тип данных "Запись", имеющий поля "Фамилия", "Пол", "Зарплата"
определить тип данных запись имеющий поля фамилия пол зарплата. определить массив из 10 записей. в...

Связать отношением наследования классы "Место", "Область", "Город", "Мегаполис"
Для определения иерархии классов связать отношением наследования классы, приведенные в приложении...


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

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

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