2014-02-26 55 views
0

我是新手C++程序員,並且一直在嘗試使用SDL庫來處理2D圖形。我一直在嘗試創建一些簡單的GUI控件,然而,我的按鈕控制有一個奇怪的問題,我一直無法解決。Button類中的錯誤 - Windows觸發了一個斷點SDL

每當我啓動在調試模式下的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's 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's 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; 

回答

0

的問題是最有可能在這兩條線:

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

color1color2是自動變量,並呼籲他們delete調用未定義的行爲。您應該只有delete變量您以前分配new

相關問題