0

这是我的第一次体验,所以不要挑剔。
这是 SIGSEGV 问题,它只出现在类链接中。“SDL_surface *ScreenSurface”指针中的问题。
这里是代码...

屏幕标题

class screen
{
public:
    screen();
    SDLclass_Window *MainWindow=NULL;
    SDL_Surface *ScreenSurface=NULL; //this is the problem pointer to the struct that cause error
    //Those pointer are't NULL, see below
    virtual ~screen();
protected:
private:
    const int SCREEN_WIDTH = 1280;
    const int SCREEN_HEIGHT = 726;
    bool init();
};

屏幕代码

screen::screen()
{

if(!init())
    {
        std::cout<<"ERROR at INIT";
        SDL_Delay( 4000 );
    }
else
    {
    bool quit=0;
    SDL_Event e;
    while (!quit)
        {
        SDL_UpdateWindowSurface(MainWindow);

            //Looking for events
            while( SDL_PollEvent( &e ) != 0 )
            {
                //User requests quit
                if( e.type == SDL_QUIT )
                {
                    quit = true;
                }
            }
        }
    }


this->~screen();
}
bool screen::init() //Initialization
{
    bool succses=1;
    if (SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        std::cout<< "SDL could not initialize! SDL_Error:"<< SDL_GetError()<<std::endl;
        succses=0;
        return succses;
    }
    MainWindow= SDL_CreateWindow( "Arachy: WIP Version", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN ); //Setting parameters to SDL_window
    if (MainWindow==NULL)
    {
        std::cout<<"can't create window"<<SDL_GetError()<<std::endl;
        succses=0;
        return succses;
    }
    else
    {
        //Get window surface
        ScreenSurface = SDL_GetWindowSurface( MainWindow );// telling ScreenSurface that it our main screen surface
    }

    return succses;
}

screen::~screen()
{
    SDL_Quit();
}

Activity 标头 (另一个使用 SDL_Surface 的类,它在上面的类 Screen 中定义)

class activity
{
public:
    activity();
    virtual ~activity();
protected:
private:
    screen mainScreen;
    void load();

};

活动代码(我试图用 SDL_FillRect() 修改 SDL_Surface 之后我在调试期间收到 SIGSEGV 信号

activity::activity()
{

    SDL_FillRect(mainScreen.ScreenSurface,NULL,SDL_MapRGB(mainScreen.ScreenSurface->format,255,000000,255));
}

请帮助我找出...谢谢

4

1 回答 1

0

问题是双重的:

A)可能会screen调用两次的析构函数,导致 SDL_DestroyWindow() 和 SDL_FreeSurface() 在无效的非 NULL 指针上被调用。

如果你绝对肯定想要调用你的析构函数两次,你至少应该在销毁它们指向的对象后将这些指针重置为 NULL。

但在大多数情况下,你应该简单地,你知道,显式调用析构函数......

B)正如现在所设置的,activity在主事件循环结束之前,永远不会调用 的构造函数主体。

于 2013-11-14T15:00:26.340 回答