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

Вылетает программа при удалении элемента вектора - C++

Восстановить пароль Регистрация
 
PreFX
25 / 20 / 1
Регистрация: 14.07.2012
Сообщений: 176
01.01.2013, 14:49     Вылетает программа при удалении элемента вектора #1
Всех с новым годом, уважаемые киберфорумцы!
Сделал я на днях класс Button, который, как и положено, представляет из себя кнопку (работаю с библиотекой SDL). Класс примерно вот такой:
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
class Button
{
    private:
           SDL_Rect Box;
    SDL_Surface* Image[4]; //according ButtonState
    bool IsActive;
    int ButtonState; //0 - not active, 1 - active, 2 - mouse is over, 3 - pressed
    vector<Button*>::iterator ButtonNumberIter;
    static vector<Button*> Buttons;
 
    public:
           Button( int x, int y, int h, int w);
    ~Button();
 
    void SetImage (int state, string path);
    void SetImage (string path0, string path1, string path2, string path3);
 
           void HandleEvents();
 
           void Show();
    static void ShowButtons(); //Shows all buttons
 
    void SetActivity (bool);
};
Конструктор:
C++
1
2
3
4
5
6
7
8
9
Button::Button( int x, int y, int h, int w ): ButtonState (1), IsActive (1)
{
    Box.x = x;
    Box.y = y;
    Box.h = h;
    Box.w = w;
    Buttons.push_back (this);
    ButtonNumberIter = Buttons.end() - 1;
}
Деструктор:
C++
1
2
3
4
Button::~Button ()
{
    Buttons.erase (ButtonNumberIter);
}
Функция ShowButtons():
C++
1
2
3
4
5
void Button::ShowButtons()
{
    for (vector<Button*>::iterator iter = Buttons.begin(); iter < Buttons.end(); iter++)
        (*iter)->Show();
}
Функция main (оставлено только касающееся темы):
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
           Button* but = new Button (70, 400, 48, 480);
           but->SetImage (1, "MenuButton.png");
    but->SetImage (2, "MenuButton.png");
    but->SetImage (3, "MenuButton1.png");
 
    int gtimemy = 0;
    while (pr.Done == 0)
    {
    if( SDL_PollEvent( &(pr.Event) ) )
           {
            but->HandleEvents();
    }
        Button::ShowButtons();
        SDL_Flip (pr.PrSurface);
        gtimemy++;
        
        if (gtimemy == 25)
        {
            delete but;
        }
        
        if (gtimemy > 100)
        {
            pr.Done = 1;
        }
        Sleep (50);
     }
Непонятно почему программа вылетает после удаления кнопки -_-
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.01.2013, 14:53     Вылетает программа при удалении элемента вектора #2
Небось потому, что цикл продолжает работу после удаления кнопки.
PreFX
25 / 20 / 1
Регистрация: 14.07.2012
Сообщений: 176
01.01.2013, 16:25  [ТС]     Вылетает программа при удалении элемента вектора #3
Там ещё одна кнопка существует.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.01.2013, 16:47     Вылетает программа при удалении элемента вектора #4
Тогда храните ещё одну ссылку на объект Button. Вы создали объект, получили указатель на него. Затем инвалидировали этот указатель после delete. И всё, потеряли единственную ссылку на своё static-монстро
Добавлено через 11 минут
Рафинированный пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Object *but = new Object();
 
int counter = 0;
while (!stopCondition) {
    if (anotherCondition) {
        but->HandleEvents();
    }
    counter++;
    if (counter == 25) {
        delete but;
    }    
    if (counter > 100) {
        stopCondition = true;
    }
}
Ни разу не смущает, что на двадцать пятой итерации объект, на который указывает but, пристрелили (соответственно, but теперь вовсе не обязана указывать на этот объект и всю static-шушеру в том числе), а потом на двадцать шестой (и до сотой итерации) мы как ни в чём не бывало обращаемся к этому объекту в шестой строке?
PreFX
25 / 20 / 1
Регистрация: 14.07.2012
Сообщений: 176
01.01.2013, 16:52  [ТС]     Вылетает программа при удалении элемента вектора #5
Э, а ведь я знал, что нужно сразу делать статик-версию метода HandleEvents... Будет возможность подойти к компьютеру - исправлю и проверю на вылеты. Спасибо -_-
Yandex
Объявления
01.01.2013, 16:52     Вылетает программа при удалении элемента вектора
Ответ Создать тему
Опции темы

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