Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
1

Удаление списка указателей

16.06.2013, 12:36. Показов 4538. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здорова!
Есть задачка:
Определите список указателей, который уничтожает объекты, адресуемые этими указателями, во время уничтожения самого списка или при удалении элемента из списка операцией remove.

От как бы решение написал, но чото со списка элемент удаляется, а сам объект не уничтожается? Или так оно и должно быть?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
using std::cout;
using std::endl;
#include <list>
using std::list;
 
 
int main()
{
    list<int*> l;
 
    int* b1=new int(4);
    int* b2=new int(5);
 
    cout <<*b1<<' '<<*b2<<endl;
 
    //добавляем указатели на объекты
    l.push_back(b1);
    l.push_back(b2);
 
    //удаляем
    cout <<*l.begin()<<' '<<b1<<endl;//адреса одинаковые
    l.remove(*l.begin());//удаление
    l.remove(*l.begin());//удаление
 
    //если через delete то удаляется
    //delete b1; //утак удалить объект
    cout <<*b1<<' '<<*b2<<endl;
 
    if(l.empty())
        cout <<"l is empty"<<endl;
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.06.2013, 12:36
Ответы с готовыми решениями:

Добавление нового указателя в конец массива указателей, удаление указанного элемента, добавление указателей
Здравствуйте. Помогите, пожалуйста, разобраться с одним большим заданием. Задание пока в процессе...

Написать код программы, выполняющей растяжку списка и вставку, удаление из списка и сжатие списка
Люди ПОМОГИТЕ осталось совсем мало , мне нужна помощь!!! написать код программ: 1) Написать код...

Удаление указателей
Всем добрый вечер! :) Разбираюсь тут с указателями и возникли вопросы. #include &lt;iostream&gt; ...

Удаление указателей на C++
#include &lt;iostream&gt; using namespace std; class Induct { public: void Set(int a) ...

19
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.06.2013, 12:55 2
нет, так не удаляет.
Так просто удаляются указатели из списка, объекты остаются живыми.
Либо вызывай перед remove delete, либо складывай в лист "умные" указатели.
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
16.06.2013, 13:16  [ТС] 3
villu, а мб тут нужно как то переопределить функцию remove? и чтобы она delete вызывала?
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.06.2013, 13:20 4
если используешь list из std, то remove будет делать то, что написано в стандарте.
Если нужен свой remove, то придется делать свой лист.
1
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, а зачем вам вообще внешние указатели на элементы списка? допустим если так
C++
1
l.push_back(new int(5));
1
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.06.2013, 13:42 9
C++
1
    list< shared_ptr<int> > l
не годится?
ну либо что-то типа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
<template T>
class ptr_list {
    std::list<T *> list_;
public:
 
    void remove( ... ) 
    {
        delete ...;
        list_.remove(...);
        ...
    }
};
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, Так да. Вы же передаете
C++
1
l.remove(*l.begin());
первый параметр списка - та память очищается и сам указатель удаляется из списка - но внешний аддрес будет указывать всеравно на область памяти - а вот при доступе к ней думаю будет access violation, если не так- то поправьте кто.
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, Можно примерно так от: ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
using std::cout;
using std::endl;
#include <list>
using std::list;
 
class list1 : public list<int*>
{
public:
    void remove(list::iterator it)
    {
        int* temp=*it;
        list::remove(*it);
        delete temp;
    }
    ~list1()
    {
        while(!list::empty())
        {
            delete *list::begin();
        }
    }
};
 
 
int main()
{
    list1 l;
 
    int* b1=new int(4);
    int* b2=new int(5);
 
    cout <<*b1<<' '<<*b2<<endl;
 
    //добавляем указатели на объекты
    l.push_back(b1);
    l.push_back(b2);
 
    //удаляем
    cout <<*l.begin()<<' '<<b1<<endl;//адреса одинаковые
    l.remove(l.begin());//удаление
    l.remove(l.begin());//удаление
 
    //если через delete то удаляется
    //delete b1; //утак удалить объект
    cout <<*b1<<' '<<*b2<<endl;
 
    if(l.empty())
        cout <<"l is empty"<<endl;
 
    return 0;
}
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, Да все правильно
Цитата Сообщение от 0x10 Посмотреть сообщение
Во-первых, remove удаляет по значению, а не по положению в списке.
ну мы значение передаем разыменовали *it
Цитата Сообщение от 0x10 Посмотреть сообщение
Во-вторых, как Вы себе представляете отладку с использованием типа int? Пишем свой класс, где в конструкторе и деструкторе фиксируем факт их вызова (тупо выводом какой-нибудь строки).
Да вроде тут ничо не нужно отлаживать вроде, просто вызвать delete и все, ток освободить память.
Цитата Сообщение от 0x10 Посмотреть сообщение
В-третьих, в деструкторе какое-то порно.
Нет в деструкторе нормально, токо мб нужно явно вызвать деструктор базового класса ~list::list() ????? в самом конце.

Добавлено через 4 минуты
0x10, а мб и зависнет деструктор хз. из цикла не выйдет.

Добавлено через 7 минут
отакой деструктор нада, такой не зависнет.
C++
1
2
3
4
5
6
7
8
9
~list1()
    {
        while(!list::empty())
        {
            delete *list::begin();
            list::remove(*list::begin());
        }
        cout <<"konec"<<endl;
    }
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.06.2013, 15:38 18
не правильный это деструктор.
Ты освобождаешь память, а потом пытаешься получить из этой памяти значение
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
16.06.2013, 15:42  [ТС] 19
villu, первый что был не правильный, последний правильный.
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.06.2013, 15:43 20
хотя, да. я забыл, что у тебя указатели, а не значения.

проще вот так сделать

C++
1
2
3
4
    
~list1() {
        for( auto f: *this  ) { delete f; }
}
1
16.06.2013, 15:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2013, 15:43
Помогаю со студенческими работами здесь

удаление указателей
Я создал указатель и выделил память vector &lt; vector &lt;Obj&gt; &gt; *p_L = new vector&lt; vector &lt;Obj&gt; &gt;;...

Применение и удаление указателей
Здравствуйте. Я не могу понять сути,когда нам нужно удалить указатель для освобождения памяти....

Удаление указателей из вектора
Что то голова совсем не варит под вечер, подскажите, вот есть у меня вектор хранящий указатели на...

Удаление массива указателей
есть класс: class test { private: static test **list; static int count_object; public:...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru