979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||||||
1 | ||||||
Удаление списка указателей16.06.2013, 12:36. Показов 4538. Ответов 19
Метки нет (Все метки)
Здорова!
Есть задачка: Определите список указателей, который уничтожает объекты, адресуемые этими указателями, во время уничтожения самого списка или при удалении элемента из списка операцией remove. От как бы решение написал, но чото со списка элемент удаляется, а сам объект не уничтожается? Или так оно и должно быть?
0
|
16.06.2013, 12:36 | |
Ответы с готовыми решениями:
19
Добавление нового указателя в конец массива указателей, удаление указанного элемента, добавление указателей Написать код программы, выполняющей растяжку списка и вставку, удаление из списка и сжатие списка Удаление указателей Удаление указателей на C++ |
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
16.06.2013, 13:16 [ТС] | 3 |
villu, а мб тут нужно как то переопределить функцию remove? и чтобы она delete вызывала?
0
|
Issues
|
16.06.2013, 13:21
#5
|
Не по теме: ninja2, ну ты же "Гуру С++", тебе не стыдно создавать такие темы? :D
1
|
БНТУ ФИТР
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
|
|
16.06.2013, 13:29 | 6 |
В список заносится указатель - потом он же и удаляется из него. А внешний указатель как ни в чем не бывало останется указывать на свою область паямяти.
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
16.06.2013, 13:36 [ТС] | 7 |
villu, А от по условию задачи как бы ты ее решил? Там явно видно что нужно std::list использовать. Так чото элементы, то не удаляются? А что в стандарте написано? Яж адреса выводил, первый элемент в l указывает на ячейку на которую указывает и указатель b1, ну и что происходит при l.remove(*l.begin())??? удаляется указатель на указатель int* ?? Да наверно. Ну мне как то нужно сделать решение, что бы условию удовлетворяло! Наверно переопределять не стоит, просто нужно наверно как то правильно инициализировать сам список? Мб ссылками, хотя пробовал ссылки не передаются. В общем хз как.
Добавлено через 1 минуту kventin_zhuk, ну из поведения видно что так и есть. Добавлено через 2 минуты Ну и господа какое будет решение задачи? Что мы в решении напишем? Напишем, что это невозможно, так как list инициализируется значениями и передача ссылок запрещена? Так что ли? Знатоки!
0
|
БНТУ ФИТР
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
|
||||||
16.06.2013, 13:36 | 8 | |||||
ninja2, а зачем вам вообще внешние указатели на элементы списка? допустим если так
1
|
16.06.2013, 13:42 | 9 | ||||||||||
ну либо что-то типа:
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
16.06.2013, 13:53 [ТС] | 10 |
kventin_zhuk, Да я думал есть допустим несколько внешних объектов и мы просто как бы их заносим в список, а потом уже удаляем список и объекты должны удалить, как то так.
Добавлено через 9 минут villu, Нет наверно не то, я просто напишу свой пример и добавлю что ничего оно не удаляется как была ячейка целая так и осталась.
0
|
БНТУ ФИТР
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
|
||||||
16.06.2013, 13:57 | 11 | |||||
ninja2, Так да. Вы же передаете
1
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
16.06.2013, 14:03 | 12 |
Самым адекватным решением тут, пожалуй, действительно будет использование умных указателей по обозначенным выше причинам. Но так как задание чисто академического плана, я думаю предполагается написать свой класс, который будет наследником std::list<T> и в деструкторе и методе remove сначала освобождать память с использованием delete.
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
16.06.2013, 14:08 [ТС] | 13 |
kventin_zhuk, Да нет вроде нормально доступ, а от когда delete и указатель, то тогда выкидает ошибку, там в коде выше закомментировано delete b1 можно раскоментировать и попробовать.
Добавлено через 2 минуты 0x10, Ну да там не много наследование сделать от list и сделать переопределение remove() и можно переопределить clean() еще. Добавлено через 1 минуту 0x10, токо не в деструкторе, а переопределенных методах вначале удалить саму память, а затем уже и вызвать list::remove()
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
16.06.2013, 14:11 | 14 |
А за что ты так дескриминируешь деструктор?
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||||||
16.06.2013, 14:54 [ТС] | 15 | |||||
kventin_zhuk, Да как то мне тоже кажется должно быть, но увы в лист просто создается new int*(int*) отакая фигня наверно либо int** mass=new int*[10]; (T* mass=new T[10] это примено шаблон)
Добавлено через 3 минуты 0x10, Да я сразу не подумал, ну и в деструкторе тоже нужно добавить, потому что если список не будет использоваться в части программы, например мы закроем какой нибуть модуль, а затем заново запустим, то память просто потеряется, поетому и в деструкторе нужно добавить, мыж ведь будем надеятся что при удалении списка она удалится если мы явно remove() не вызовем, а она просто затеряется. Просто сразу не понял. Добавлено через 37 минут 0x10, Можно примерно так от: ?
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
16.06.2013, 15:09 | 16 |
Во-первых, remove удаляет по значению, а не по положению в списке.
Во-вторых, как Вы себе представляете отладку с использованием типа int? Пишем свой класс, где в конструкторе и деструкторе фиксируем факт их вызова (тупо выводом какой-нибудь строки). В-третьих, в деструкторе какое-то порно.
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||||||
16.06.2013, 15:33 [ТС] | 17 | |||||
0x10, Да все правильно
ну мы значение передаем разыменовали *it Да вроде тут ничо не нужно отлаживать вроде, просто вызвать delete и все, ток освободить память. Нет в деструкторе нормально, токо мб нужно явно вызвать деструктор базового класса ~list::list() ????? в самом конце. Добавлено через 4 минуты 0x10, а мб и зависнет деструктор хз. из цикла не выйдет. Добавлено через 7 минут отакой деструктор нада, такой не зависнет.
0
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
16.06.2013, 15:42 [ТС] | 19 |
villu, первый что был не правильный, последний правильный.
0
|
16.06.2013, 15:43 | 20 | |||||
хотя, да. я забыл, что у тебя указатели, а не значения.
проще вот так сделать
1
|
16.06.2013, 15:43 | |
16.06.2013, 15:43 | |
Помогаю со студенческими работами здесь
20
удаление указателей Применение и удаление указателей Удаление указателей из вектора Удаление массива указателей Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |