Ошибка в классе кнопки - Windows запустила SDL точки останова

0

Я новичок C++ программист, и я экспериментировал с библиотеками SDL для 2-й графики. Я возился с попыткой создать несколько простых элементов управления графическим интерфейсом; тем не менее, у моего кнопочного элемента есть странная проблема, которую я не смог решить.

Всякий раз, когда я запускаю программу в режиме отладки, Visual Studio сразу дает мне окно с сообщением об ошибке

"Windows вызвала точку останова в файле Default_SDL_Setup.exe.

Это может быть связано с повреждением кучи, что указывает на ошибку в файле Default_SDL_Setup.exe или в любой из загружаемых DLL файлов.

Это также может быть вызвано нажатием кнопки F12, а в фокусе Default_SDL_Setup.exe.

В окне вывода может быть больше диагностической информации ".

и всплывает файл crtexe.c в окне редактора кода.

Я не знаю, что не так или что происходит.

Вот мой заголовок кнопки:

#ifndef BUTTON_T
 #define BUTTON_T
 #include <vector>
 #include <string>
 #include "SDL.h"
 #include "SDL_ttf.h"
 #include "SDLFunctions.h"
#endif

class button
{
private:
    //refreshes the button
    void refresh_image();
    bool refresh;

    //surface to hold the created text
    SDL_Surface *message;

    //color of text
    SDL_Color tC;

    //the different box types
    struct boxColor
    {
        unsigned int r;
        unsigned int g;
        unsigned int b;
    };
    boxColor boxes[4];
    SDL_Rect rects[4];

    //font of text
    TTF_Font *f;

    /*button state
     * States are:
     * 0 - mouseout
     * 1 - mouseover
     * 2 - mousedown
     * 3 - mouseup
     */
    int state;

public:
    //autosize based off of text?
    bool autoSize;

    //size of text
    int textSize;

    //x,y,w,and h for the box
    int x, y, w, h;

    //text of the label
    std::string text;

    button(int xpos, int ypos, int width, int height);
    ~button();

    //handles all events for the button
    void handleEvents(SDL_Event *event);

    //sets text font style off of a string location, color expects a 3 dimensional array
    void setFont(std::string fontFileLocation);
    void setFont(int color[3]);
    void setFont(std::string fontFileLocation, int color[3]);

    //gets the text color as a vector
    std::vector<int> textColor();

    //returns the color of the specified box
    std::vector<int> boxColor(int boxnum);

    //sets the color of the specified box, expects a 3 dimensional array
    void setBoxColor(int boxnum, int color[3]);

    void render(SDL_Surface *screen);
};

Вот код кнопки:

#include "button.h"

using namespace std;

void button::refresh_image()
{
    if (refresh)
    {
        if (f != NULL)
        {
            message = TTF_RenderText_Solid(f, text.c_str(), tC);
            if ((message != NULL) && autoSize)
            {
                if (message->w >= w)
                {
                    w = (message->w + 10);
                }
                if (message->h >= h)
                {
                    h = (message->h + 10);
                }
            }
        }

        for (int i = 0; i != 4; ++i)
        {
            rects[i].x = x;
            rects[i].y = y;
            rects[i].w = w;
            rects[i].h = h;
        }
        refresh = false;
    }
}

button::button(int xpos, int ypos, int width, int height)
{
    string defaultFontLocation = DEFAULT_FONT;

    //set pos
    x = xpos;
    y = ypos;
    w = width;
    h = height;

    //set text stuff
    text = "";
    textSize = DEFAULT_FONT_SIZE;
    tC.r = 0;
    tC.g = 0;
    tC.b = 0;
    f = TTF_OpenFont(defaultFontLocation.c_str(), textSize);
    message = NULL;

    //create box types
    state = 0;
    for (int i = 0; i != 4; ++i)
    {
        boxes[i].r = 255;
        boxes[i].g = 255;
        boxes[i].b = 255;
        rects[i].x = x;
        rects[i].y = y;
        rects[i].w = w;
        rects[i].h = h;
    }

    autoSize = true;
    refresh = true;

    refresh_image();
}

button::~button()
{
    if (f != NULL)
    {
        TTF_CloseFont(f);
    }

    if (message != NULL)
    {
        SDL_FreeSurface(message);
    }
}

void button::setFont(string fontFileLocation)
{
    if (f != NULL)
    {
        TTF_CloseFont(f);
    }

    f = TTF_OpenFont(fontFileLocation.c_str(), textSize);
    refresh_image();
}

void button::setFont(int color[3])
{
    tC.r = color[0];
    tC.g = color[1];
    tC.b = color[2];
    refresh_image();
}

void button::setFont(string fontFileLocation, int color[3])
{
    if (f != NULL)
    {
        TTF_CloseFont(f);
    }

    f = TTF_OpenFont(fontFileLocation.c_str(), textSize);

    tC.r = color[0];
    tC.g = color[1];
    tC.b = color[2];

    refresh_image();
}

vector<int> button::textColor()
{
    vector<int> colors;
    colors.resize(3);

    colors[0] = tC.r;
    colors[1] = tC.g;
    colors[2] = tC.b;

    return colors;
}

vector<int> button::boxColor(int boxnum)
{
    vector<int> colors;
    colors.resize(3);

    if ((boxnum <= 3) && (boxnum >= 0))
    {
        colors[0] = boxes[boxnum].r;
        colors[1] = boxes[boxnum].g;
        colors[2] = boxes[boxnum].b;
    } else {
        colors[0] = -1;
        colors[1] = -1;
        colors[2] = -1;
    }

    return colors;
}

void button::setBoxColor(int boxnum, int color[3])
{

    if ((boxnum <= 3) && (boxnum >= 0))
    {
        boxes[boxnum].r = color[0];
        boxes[boxnum].g = color[1];
        boxes[boxnum].b = color[2];
        //refresh_image();
    }
}

void button::render(SDL_Surface *screen)
{
    refresh_image();
    SDL_FillRect(screen, &rects[state], SDL_MapRGB(screen->format, static_cast<Uint8>(boxes[state].r), static_cast<Uint8>(boxes[state].g), static_cast<Uint8>(boxes[state].b)));
    if (message != NULL)
    {
        apply_surface((((x + w) - message->w) / 2), (((y + h) - message->h) / 2), message, screen);
    }

    refresh = true;
}

void button::handleEvents(SDL_Event *event)
{
    //the mouse offsets
    int mx, my;

    //if mouse moved
    if (event->type == SDL_MOUSEMOTION)
    {
        //get the mouse offsets
        mx = event->motion.x;
        my = event->motion.y;

        //if the mouse is over the button
        if ((mx > x) && (mx < (x + w)) && (my > y) && (my < (y + h)))
        {
            //set the button sprite
            state = 1;
        } else {
            //set the button sprite
            state = 0;
        }
    } 

    //if a mouse button was pressed
    if (event->type == SDL_MOUSEBUTTONDOWN)
    {
        //if it was the left mouse button
        if (event->button.button == SDL_BUTTON_LEFT)
        {
            //get the mouse offsets
            mx = event->motion.x;
            my = event->motion.y;

            //if the mouse is over the button
            if ((mx > x) && (mx < (x + w)) && (my > y) && (my < (y + h)))
            {
                //set the button sprite
                state = 2;
            }
        }
    }

        //if a mouse button was released
    if (event->type == SDL_MOUSEBUTTONUP)
    {
        //if it was the left mouse button
        if (event->button.button == SDL_BUTTON_LEFT)
        {
            //get the mouse offsets
            mx = event->motion.x;
            my = event->motion.y;

            //if the mouse is over the button
            if ((mx > x) && (mx < (x + w)) && (my > y) && (my < (y + h)))
            {
                //set the button sprite
                state = 3;
            }
        }
    }
}

и вот код, который я вызывал, чтобы создать кнопку в моей функции main():

int color1[3] = {105,240,81};
int color2[3] = {230,188,62};
button testbutton(360, 130, 50, 30);
testbutton.text = "TEST";
testbutton.setBoxColor(1, color1);
testbutton.setBoxColor(2, color2);
delete[] &color1;
delete[] &color2;
Теги:
debugging
sdl

1 ответ

0
Лучший ответ

Проблема, скорее всего, в этих двух строках:

delete[] &color1;
delete[] &color2;

color1 и color2 автоматические переменные, и вызов delete на них вызывает неопределенное поведение. Вам следует delete только те переменные, которые вы ранее назначили new.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню