SDL2 因 InputHandler 鼠标移动而崩溃

Posted

技术标签:

【中文标题】SDL2 因 InputHandler 鼠标移动而崩溃【英文标题】:SDL2 crash whit InputHandler mouse motion 【发布时间】:2014-05-06 20:18:30 【问题描述】:

没有警告,没有错误。编译正常,但在 update 函数的底部,以下几行会使程序崩溃:

(*m_mousePosition).setX(event.motion.x);
(*m_mousePosition).setY(event.motion.y);

这是完整的代码:

#include <SDL2/SDL.h>
#include <vector>
#include "Vector2D.h"

using namespace std;

#ifndef INPUTHANDLER_H
#define INPUTHANDLER_H

enum mouse_buttons
   LEFT = 0,
   MIDDLE = 1,
   RIGHT = 2
;

class InputHandler

public:

    static InputHandler* Instance()
        if(s_pInstance==0)
            s_pInstance= new InputHandler();
        
        return s_pInstance;
    

    void update()
        if(event.type == SDL_MOUSEBUTTONDOWN)
            if(event.button.button == SDL_BUTTON_LEFT)
                m_mouseButtonStates[LEFT]=true;
            
            if(event.button.button == SDL_BUTTON_MIDDLE)
                m_mouseButtonStates[MIDDLE]=true;
            
            if(event.button.button == SDL_BUTTON_RIGHT)
                m_mouseButtonStates[RIGHT]=true;
            
        
        if(event.type == SDL_MOUSEBUTTONUP)
            if(event.button.button == SDL_BUTTON_LEFT)
                m_mouseButtonStates[LEFT]=false;
            
            if(event.button.button == SDL_BUTTON_MIDDLE)
                m_mouseButtonStates[MIDDLE]=false;
            
            if(event.button.button == SDL_BUTTON_RIGHT)
                m_mouseButtonStates[RIGHT]=false;
            
        
        if(event.type == SDL_MOUSEMOTION)
            (*m_mousePosition).setX(event.motion.x);
            (*m_mousePosition).setY(event.motion.y);
        
    

    SDL_Event* getEvent()
        return &event;
    

    void clear();


    bool getMouseButtonStates(int buttonNumber)
        return m_mouseButtonStates[buttonNumber];
    

    Vector2D* getMousePosition()
        return m_mousePosition;
    

private:

    SDL_Event event;

    vector<bool> m_mouseButtonStates;

    Vector2D* m_mousePosition;

    InputHandler()
        for(int i=0; i<3; i++)
            m_mouseButtonStates.push_back(false);
        
    
    ~InputHandler()

    static InputHandler* s_pInstance;

;

typedef InputHandler TheInputHandler;

#endif  /* INPUTHANDLER_H */

也许是指针的问题,但我不知道,我无法解决

===============================新编辑=============== ========================

现在我不使用指针,但我必须用两个参数初始化Vector2D。我把它放在InputHandler 构造函数中:

InputHandler::InputHandler():m_position(0,0)
    for(int i=0; i<3; i++)
        m_mouseButtonStates.push_back(false);
    

并给我以下错误:

InputHandler.cpp:12:30: error: member initializer 'm_position' does not name a non-static data member or base class
InputHandler::InputHandler():m_position(0,0)
                             ^~~~~~~~~~~~~~~

Vector2D类的定义:

#include<math.h>

using namespace std;

#ifndef VECTOR2D_H
#define VECTOR2D_H

class Vector2D 
public:
    Vector2D(float x, float y):m_x(x), m_y(y)

    float getX()return m_x;
    float getY()return m_y;

    void setX(float x)m_x=x;
    void setY(float y)m_y=y;

    float length()return sqrt(m_x*m_x + m_y*m_y);

private:

    float m_x;
    float m_y;

;

#endif  /* VECTOR2D_H */

【问题讨论】:

有什么问题?您想知道它为什么崩溃或如何防止它崩溃吗? 你的 m_position 是多少?我没有看到它声明,所以很难说是什么问题 我解决了这个问题。只在构造函数中声明指针。 @jofra 变量 m_position 它是在基类中声明的 Vector2D 变量。 【参考方案1】:

是的,问题在于您所说的“指针”。

m_mousePosition 已声明,但您从未为其分配任何内容,因此它是 NULL/垃圾。 你可能不需要在这里使用指针。

【讨论】:

我换个问题。抱歉,我无法将其放在评论中

以上是关于SDL2 因 InputHandler 鼠标移动而崩溃的主要内容,如果未能解决你的问题,请参考以下文章

SDL2 相对鼠标模式报告鼠标未移动时的运动

golang调用sdl2,键盘和鼠标事件

SDL2 OpenGL C++ 移动使用 VBO 和 FBO 绘制的精灵

在 Kivy 中使用 sdl2 而不是 pygame

Django CORS 因来自移动应用程序的发布请求而失败

如果允许JVM在垃圾收集期间移动堆内存,那么垃圾收集如何不因移动指针而导致JNI爆炸?