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

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

Войти
Регистрация
Восстановить пароль
 
pashqa_cpp
0 / 0 / 0
Регистрация: 05.04.2013
Сообщений: 12
#1

Пытаюсь обуздать list - C++

11.04.2013, 11:28. Просмотров 229. Ответов 7
Метки нет (Все метки)

В коде помечено место которое я не понимаю. А именно почему не работает.
Взято и другого кода, где тот же метод работает правильно!
С начало подумал, что erase удаляет объекты list, но быстро передумал.
Тогда не вижу проблем к зависанию программы..

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
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <list>
#include <conio.h>
 
using std::cout;
using std::list;
 
struct vec {float x; float y;};
 
class cBullet
{
private:
    int spr;
    vec pos;
public:
    cBullet(int s, vec p): spr(s), pos(p)
    {
        cout << "cBullet create <" << spr << "> (" << pos.x << "," << pos.y << ")\n";
    }
 
    ~cBullet()
    {
        cout << "cBullet destroy <" << spr << "> (" << pos.x << "," << pos.y << ")\n";
    }
 
    vec GetPos() const {return pos;}
};
 
int main()
{
    // list
    list<cBullet*> Bullets;
    cBullet* bullet = NULL;
    vec vb = {0.0, 0.0};
    int i = 0;
    
    for(int j = 0; j < 5; j++)
    {
        bullet = new cBullet(i, vb);
        Bullets.push_back(bullet);
        
        i++; vb.x++; vb.y++;
    }
 
    cout << "\n\n\n";
 
    // OT CUX
    for(std::list<cBullet*>::iterator a = Bullets.begin(); a != Bullets.end();)
    {
        if((*a)->GetPos().x > 0)
        {
            a = Bullets.erase(a);
        }
    }
    // DO CUX
    // GLUCHIT)
 
    for(std::list<cBullet*>::iterator k = Bullets.begin(); k != Bullets.end();)
    {
        delete (*k);
        k = Bullets.erase(k);
    }
    
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2013, 11:28     Пытаюсь обуздать list
Посмотрите здесь:

Пытаюсь создать алфавит - C++
Хочу внести в строку весь русский и латинский алфавит + символы.. В чем ошибка? include &lt;iostream&gt; using namespace std; #include...

Пытаюсь написать таймер на С++, но линукс против - C++
Приветствую! Соорудил таймер: #include &lt;iostream&gt; #include &lt;ctime&gt; using namespace std;

Пытаюсь разбираться с переполнением буфера в куче - C++
Нашел такой код: #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;windows.h&gt; int main(int argc, char* argv) { char *c = (char...

Пытаюсь реализовать сортировку слиянием (выскакивает ошибка) - C++
Пытаюсь реализовать сортировку слиянием. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;windows.h&quot; #include &quot;math.h&quot; // m -...

Программа зависает, если я пытаюсь считать массив - C++
Вообще я пометил, где зависает. Каковы могут быть причины? Пы.Сы. Файл e.in.txt содержит вот такое: 20 2 2 15 17 2 19 5 ...

вопрос по gdb (пытаюсь отловить segmentation fault) - C++
Добрый вечер. В обшем история такая, запуск программы с gdb выводит следуюшее сообшение: *** auto turn END was activated, turn num =...

Пытаюсь рекурсивно сделать задачу. гляньте код плз) - C++
КТО-НИБУДЬ, избавьте меня от мучений, гляньте код, посмотрите где я лажанул((( Пытаюсь решить задачу рекурсивно, упражняясь в этом...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
11.04.2013, 11:34     Пытаюсь обуздать list #2
Логично же все. Если GetPos().x > 0 удаляем элемент, а если меньше - остаемся на том же. ++a в else добавьте.

C++
1
2
3
4
5
6
7
8
9
10
11
    for(std::list<cBullet*>::iterator a = Bullets.begin(); a != Bullets.end();)
    {
        if((*a)->GetPos().x > 0)
        {
            a = Bullets.erase(a);
        }
        else
        {
           ++a;
        }
    }
pashqa_cpp
0 / 0 / 0
Регистрация: 05.04.2013
Сообщений: 12
11.04.2013, 11:47  [ТС]     Пытаюсь обуздать list #3
А erase освобождает память? Потому-что деструкторы не срабатываю...
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
11.04.2013, 11:58     Пытаюсь обуздать list #4
pashqa_cpp, Нет конечно, с чего? delete потом erase и ок.
pashqa_cpp
0 / 0 / 0
Регистрация: 05.04.2013
Сообщений: 12
11.04.2013, 12:03  [ТС]     Пытаюсь обуздать list #5
Тогда я вообще не понимаю..
Создаю 150 элементов, erase тех, которые имеют x>3.
После, удаляю элементы list'a получая 3(ТРИ!!!) деструктора.
Получается я потерял памяти на 147 элементов и не знаю по какому
адресу они проживают..,(О Господи!) они потеряны?!

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <list>
#include <conio.h>
 
using std::cout;
using std::list;
 
struct vec {float x; float y;};
 
class cBullet
{
private:
    int spr;
    vec pos;
public:
    cBullet(int s, vec p): spr(s), pos(p)
    {
        cout << "cBullet create <" << spr << "> (" << pos.x << "," << pos.y << ")\n";
    }
 
    ~cBullet()
    {
        cout << "cBullet destroy <" << spr << "> (" << pos.x << "," << pos.y << ")\n";
    }
 
    vec GetPos() const {return pos;}
};
 
int main()
{
    // list
    list<cBullet*> Bullets;
    cBullet* bullet = NULL;
    vec vb = {0.0, 0.0};
    int i = 0;
    
    for(int j = 0; j < 150; j++)
    {
        bullet = new cBullet(i, vb);
        Bullets.push_back(bullet);
        
        i++; vb.x++; vb.y++;
    }
 
    cout << Bullets.size() << "\n";
    
    // OT CUX
    for(std::list<cBullet*>::iterator a = Bullets.begin(); a != Bullets.end();)
    {
        if((*a)->GetPos().x > 3)
        {
            a = Bullets.erase(a);
        }
        else
        {
            a++;
        }
 
    }
    cout << Bullets.size() << "\n";
    // DO CUX
    // GLUCHIT)
 
    for(std::list<cBullet*>::iterator q = Bullets.begin(); q != Bullets.end();)
    {
        delete (*q);
        q = Bullets.erase(q);
    }
    cout << Bullets.size() << "\n";
    
    return 0;
}
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
11.04.2013, 12:10     Пытаюсь обуздать list #6
pashqa_cpp, Да. Потеряны.

C++
1
2
3
4
5
6
7
8
9
10
11
12
    for(std::list<cBullet*>::iterator a = Bullets.begin(); a != Bullets.end();)
    {
        if((*a)->GetPos().x > 3)
        {
            delete (*a);
            a = Bullets.erase(a);
        }
        else
        {
            a++;
        }
    }
И все ок. И вообще, храните кмные указатели в векторе, вместо нативных указателей.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
11.04.2013, 12:11     Пытаюсь обуздать list #7
Цитата Сообщение от pashqa_cpp Посмотреть сообщение
они потеряны?!
Конечно потеряны, у Вас же список из указателей, а для указателя никакого деструктора нет. Либо используйте список объектов (а не указателей), либо используйте "умные" указатели.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2013, 12:19     Пытаюсь обуздать list
Еще ссылки по теме:

Пытаюсь вывести латинские буквы но не могу реализовать затею - C++
Доброе время суток необходимо сделать лабораторную работу но не могу понять как составить условие. смотря на задание я понимаю...

компенсатор ругается когда пытаюсь внедрить defualt and normal inline - C++
//pointer.h #ifndef POINTER_H #define POINTER_H class Point { private: double Xcoord; double Ycoord;

Пытаюсь создать описание класса одномерных массивов строк. В чем моя ошибка? - C++
Помогите пожалуйста! Пытаюсь создать описание класса одномерных массивов строк. В чем моя ошибка? #include &lt;iostream&gt; #include...

Необъявленный идентефикатор cout, или "Как я пытаюсь найти нормальную книгу" - C++
Доброго времени суток, в общем недавно я начал изучать C++, мне посоветовали книгу &quot;C++ за двадцать один день&quot; (автор Джесс Либерти), в ней...

<list> - C++
Подскажите как вызвать функцию объекта помещенного в список? У меня есть абстрактный класс Book от него производный класс Science ...


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

Или воспользуйтесь поиском по форуму:
pashqa_cpp
0 / 0 / 0
Регистрация: 05.04.2013
Сообщений: 12
11.04.2013, 12:19  [ТС]     Пытаюсь обуздать list #8
Спасибо
Yandex
Объявления
11.04.2013, 12:19     Пытаюсь обуздать list
Ответ Создать тему
Опции темы

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