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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
19.02.2010, 03:43     "Очереди" - очистка памяти #1
Привет всем, у меня возникла такая проблема, есть функция которая делает выборку из очереди:

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++ "Очереди" как сделать?
Необработанное исключение в "0x775e15de" в "laba3.exe": 0xC0000005: Нарушение прав доступа при чтении "0xfdfdfdf9". C++
Необработанное исключение в "0x778e15de" в "dir-3.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000000" C++
C++ Необработанное исключение в "0x013f2b22" в "123.exe": 0xC0000005: Нарушение прав доступа при записи "0xfdfdfdfd"
C++ С++ консольное приложение win32, матерится на первое "pow" после "if", а на "system" говорит что неопределён.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
19.02.2010, 03:49     "Очереди" - очистка памяти #2
_Eldar_, тут посмотрите
_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
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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_
 Аватар для _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
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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++ очистка экрана system("cls")
C++ В массиве структур студент с полями "ИМЯ" "ВОЗРАСТ" "УСПЕВАЕМОСТЬ" выполнить сортировку по успеваемости по возрастанию
C++ "Очистка" массива wchar_t

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

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

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