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

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

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

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

16.06.2013, 12:36. Просмотров 995. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2013, 12:36     Удаление списка указателей
Посмотрите здесь:

Удаление указателей на 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++
есть класс: class test { private: static test **list; static int count_object; public: void mesto::Add() {

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
16.06.2013, 12:55     Удаление списка указателей #2
нет, так не удаляет.
Так просто удаляются указатели из списка, объекты остаются живыми.
Либо вызывай перед remove delete, либо складывай в лист "умные" указатели.
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
БНТУ ФИТР
215 / 155 / 15
Регистрация: 26.12.2012
Сообщений: 382
16.06.2013, 13:29     Удаление списка указателей #6
В список заносится указатель - потом он же и удаляется из него. А внешний указатель как ни в чем не бывало останется указывать на свою область паямяти.
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
БНТУ ФИТР
215 / 155 / 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
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.06.2013, 13:53  [ТС]     Удаление списка указателей #10
kventin_zhuk, Да я думал есть допустим несколько внешних объектов и мы просто как бы их заносим в список, а потом уже удаляем список и объекты должны удалить, как то так.

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

Динамическая структура данных в форме односвязного списка на основе указателей - C++
Не могли вы написать простенький пример программы на языке С++, Delphi или даже псевдокоде, которая реализует алгоритмы основных операций...

Обращение к элементам линейного списка через элементы массива указателей - C++
Вот полная версия программы. Компилятор не выдаёт ошибок, но при выполнении, судя по всему, на строчке 278, при попытке обратится к...

Изменить последовательность указателей так, чтобы отрицательные числа находились в начале списка - C++
Проблема в методе Sort и Show. Первый неверно сортирует, а второй зацикливается во время выполнения. Скорее всего, причиной второй...

Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк - C++
Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк...

Удаление списка - C++
Здравствуйте! Для реализации Хэш таблицы с индексами от 0 до 9 создал структуру и класс. Хэш таблица хранит числа, ключ это остаток от...


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

Или воспользуйтесь поиском по форуму:
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;
}
Yandex
Объявления
16.06.2013, 14:54     Удаление списка указателей
Ответ Создать тему
Опции темы

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