С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

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

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

Здорова!
Есть задачка:
Определите список указателей, который уничтожает объекты, адресуемые этими указателями, во время уничтожения самого списка или при удалении элемента из списка операцией 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2013, 12:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление списка указателей (C++):

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

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

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

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

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

Удаление массива указателей - C++
есть класс: class test { private: static test **list; static int count_object; public: void mesto::Add() {

19
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.06.2013, 12:55 #2
нет, так не удаляет.
Так просто удаляются указатели из списка, объекты остаются живыми.
Либо вызывай перед remove delete, либо складывай в лист "умные" указатели.
1
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.06.2013, 13:16  [ТС] #3
villu, а мб тут нужно как то переопределить функцию remove? и чтобы она delete вызывала?
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.06.2013, 13:20 #4
если используешь list из std, то remove будет делать то, что написано в стандарте.
Если нужен свой remove, то придется делать свой лист.
1
Issues
16.06.2013, 13:21
  #5

Не по теме:

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

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

Добавлено через 9 минут
villu, Нет наверно не то, я просто напишу свой пример и добавлю что ничего оно не удаляется как была ячейка целая так и осталась.
0
kventin_zhuk
БНТУ ФИТР
215 / 155 / 15
Регистрация: 26.12.2012
Сообщений: 382
16.06.2013, 13:57 #11
ninja2, Так да. Вы же передаете
C++
1
l.remove(*l.begin());
первый параметр списка - та память очищается и сам указатель удаляется из списка - но внешний аддрес будет указывать всеравно на область памяти - а вот при доступе к ней думаю будет access violation, если не так- то поправьте кто.
1
0x10
2486 / 1661 / 249
Регистрация: 24.11.2012
Сообщений: 4,136
16.06.2013, 14:03 #12
Самым адекватным решением тут, пожалуй, действительно будет использование умных указателей по обозначенным выше причинам. Но так как задание чисто академического плана, я думаю предполагается написать свой класс, который будет наследником std::list<T> и в деструкторе и методе remove сначала освобождать память с использованием delete.
1
ninja2
231 / 187 / 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()
0
0x10
2486 / 1661 / 249
Регистрация: 24.11.2012
Сообщений: 4,136
16.06.2013, 14:11 #14
А за что ты так дескриминируешь деструктор?
1
ninja2
231 / 187 / 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;
}
0
16.06.2013, 14:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2013, 14:54
Привет! Вот еще темы с ответами:

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

Копирование списка указателей на виртуальный класс - C++
Добрый день! Подскажите, пожалуйста. Имею примерно такой код class Abstract { public: int mAbs;

Удаление содержимого указателей, хранящихся в векторе - C++
Здравствуйте! Меня озадачила одна проблема: допустим у нас есть вектор указателей, ссылающихся на класс А: vector&lt;A*&gt; va; Мы его...

Удаление элементов из односвязного списка списка - C++
Привет всем знатокам, суровым программистам и профессионалам своего дела. Засел за реализацией списка и что то пока не могу понять. Задача...


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

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

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