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

удаление списка указателей - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.06.2013, 12:36     удаление списка указателей #1
Здорова!
Есть задачка:
Определите список указателей, который уничтожает объекты, адресуемые этими указателями, во время уничтожения самого списка или при удалении элемента из списка операцией 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.06.2013, 12:55     удаление списка указателей #2
нет, так не удаляет.
Так просто удаляются указатели из списка, объекты остаются живыми.
Либо вызывай перед remove delete, либо складывай в лист "умные" указатели.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.06.2013, 13:16  [ТС]     удаление списка указателей #3
villu, а мб тут нужно как то переопределить функцию remove? и чтобы она delete вызывала?
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.06.2013, 13:20     удаление списка указателей #4
если используешь list из std, то remove будет делать то, что написано в стандарте.
Если нужен свой remove, то придется делать свой лист.
Issues
16.06.2013, 13:21
  #5

Не по теме:

ninja2, ну ты же "Гуру С++", тебе не стыдно создавать такие темы?

kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
16.06.2013, 13:29     удаление списка указателей #6
В список заносится указатель - потом он же и удаляется из него. А внешний указатель как ни в чем не бывало останется указывать на свою область паямяти.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.06.2013, 13:36  [ТС]     удаление списка указателей #7
villu, А от по условию задачи как бы ты ее решил? Там явно видно что нужно std::list использовать. Так чото элементы, то не удаляются? А что в стандарте написано? Яж адреса выводил, первый элемент в l указывает на ячейку на которую указывает и указатель b1, ну и что происходит при l.remove(*l.begin())??? удаляется указатель на указатель int* ?? Да наверно. Ну мне как то нужно сделать решение, что бы условию удовлетворяло! Наверно переопределять не стоит, просто нужно наверно как то правильно инициализировать сам список? Мб ссылками, хотя пробовал ссылки не передаются. В общем хз как.

Добавлено через 1 минуту
kventin_zhuk, ну из поведения видно что так и есть.

Добавлено через 2 минуты
Ну и господа какое будет решение задачи? Что мы в решении напишем? Напишем, что это невозможно, так как list инициализируется значениями и передача ссылок запрещена? Так что ли? Знатоки!
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
16.06.2013, 13:36     удаление списка указателей #8
ninja2, а зачем вам вообще внешние указатели на элементы списка? допустим если так
C++
1
l.push_back(new int(5));
villu
202 / 202 / 4
Регистрация: 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(...);
        ...
    }
};
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.06.2013, 13:53  [ТС]     удаление списка указателей #10
kventin_zhuk, Да я думал есть допустим несколько внешних объектов и мы просто как бы их заносим в список, а потом уже удаляем список и объекты должны удалить, как то так.

Добавлено через 9 минут
villu, Нет наверно не то, я просто напишу свой пример и добавлю что ничего оно не удаляется как была ячейка целая так и осталась.
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
16.06.2013, 13:57     удаление списка указателей #11
ninja2, Так да. Вы же передаете
C++
1
l.remove(*l.begin());
первый параметр списка - та память очищается и сам указатель удаляется из списка - но внешний аддрес будет указывать всеравно на область памяти - а вот при доступе к ней думаю будет access violation, если не так- то поправьте кто.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
16.06.2013, 14:03     удаление списка указателей #12
Самым адекватным решением тут, пожалуй, действительно будет использование умных указателей по обозначенным выше причинам. Но так как задание чисто академического плана, я думаю предполагается написать свой класс, который будет наследником std::list<T> и в деструкторе и методе remove сначала освобождать память с использованием delete.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.06.2013, 14:08  [ТС]     удаление списка указателей #13
kventin_zhuk, Да нет вроде нормально доступ, а от когда delete и указатель, то тогда выкидает ошибку, там в коде выше закомментировано delete b1 можно раскоментировать и попробовать.

Добавлено через 2 минуты
0x10, Ну да там не много наследование сделать от list и сделать переопределение remove() и можно переопределить clean() еще.

Добавлено через 1 минуту
0x10, токо не в деструкторе, а переопределенных методах вначале удалить саму память, а затем уже и вызвать list::remove()
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
16.06.2013, 14:11     удаление списка указателей #14
А за что ты так дескриминируешь деструктор?
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
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;
}
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
16.06.2013, 15:09     удаление списка указателей #16
Во-первых, remove удаляет по значению, а не по положению в списке.
Во-вторых, как Вы себе представляете отладку с использованием типа int? Пишем свой класс, где в конструкторе и деструкторе фиксируем факт их вызова (тупо выводом какой-нибудь строки).
В-третьих, в деструкторе какое-то порно.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
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;
    }
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.06.2013, 15:38     удаление списка указателей #18
не правильный это деструктор.
Ты освобождаешь память, а потом пытаешься получить из этой памяти значение
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.06.2013, 15:42  [ТС]     удаление списка указателей #19
villu, первый что был не правильный, последний правильный.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2013, 15:43     удаление списка указателей
Еще ссылки по теме:

Удаление элемента списка и всего списка C++
C++ Удаление указателей на C++
Удаление элементов из односвязного списка списка C++

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

Или воспользуйтесь поиском по форуму:
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.06.2013, 15:43     удаление списка указателей #20
хотя, да. я забыл, что у тебя указатели, а не значения.

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

C++
1
2
3
4
    
~list1() {
        for( auto f: *this  ) { delete f; }
}
Yandex
Объявления
16.06.2013, 15:43     удаление списка указателей
Ответ Создать тему
Опции темы

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