SFML中的Segfault

时间:2017-12-27 20:14:14

标签: c++ sfml

我试图使用SFML创建一个非常简单的程序,但我不断收到段错误。 我现在只是试图创建一个窗口,当我把所有东西都放在main函数中时它正在工作但是当我尝试创建一个类时它会保持segfaulting。

这是我的代码:

的main.cpp

int main()
{
    Graphics g(1000, 500, "Window");
    return (0);
}

有Graphics.h

class Graphics
{
public:
    Graphics(int width, int height, std::string name);
    ~Graphics();

private:
    sf::RenderWindow _window;
    int _width;
    int _height;
};

Graphics.cpp

Graphics::Graphics(int width, int height, std::string name)
{
//  this->_window = new sf::RenderWindow(sf::VideoMode(width, height), name);
    this->_window.setTitle(name);
    this->_window.setSize(sf::Vector2u(width, height));
    this->_width = width;
    this->_height = height;
}

Graphics::~Graphics()
{
}

它在构造函数的第一行产生错误:

this->_window.setTitle(name);

我还试图让_window成为一个指针并使用新的sf :: RenderWindow初始化它,但它以相同的方式进行了段错误。

我之前在Linux上使用过很多SFML,从来没有遇到过这个问题。这是我第一次在Windows上使用它。

2 个答案:

答案 0 :(得分:1)

sf :: Window的默认构造函数不初始化窗口。您需要使用方法create()手动执行此操作,如: this->_window.create(sf::VideoMode(width, height), name) 或者,我最好建议使用,使用成员初始化列表在构造函数中初始化窗口:

Graphics::Graphics(int width, int height, std::string name)
    :    window(sf::RenderWindow(sf::VideoMode(width, height), name))
{
...
}

关于SFML文档here的更广泛解释。

答案 1 :(得分:0)

这似乎是您所显示的代码之外的一些奇怪问题。考虑到在传递STL对象(std::string)时会发生这种情况,您是否有可能以某种方式混合不同的运行时库(静态与共享,调试与发布)?

使用sf::Windowsf::RenderWindow而无需专门创建它们(通过带参数的构造函数或通过调用create()成员)不会导致分段错误或任何其他问题。它应该默默地失败(通过什么都不做)。

这是一个简短的测试程序:

#include <SFML/Graphics.hpp>
#include <string>

int main(int argc, char **argv) {
    sf::RenderWindow window;
    std::string test("Hello World!");
    window.setTitle(test);
    return 0;
}

执行时,该程序将运行一段时间,然后正常结束(返回0),没有任何错误或其他任何错误。如果这仍然会让你崩溃,那很可能就是你的环境。

由于SFML接受并返回STL对象,因此您在SFML(或其他任何库)内部和外部使用完全相同的版本非常重要。理想情况下,我建议您自己编译SFML,这样可以解决问题而无需大量试用和错误。

修改:由于问题仅在您传递std::string时出现,而不是在传递char*时出现,因此它确实显然是STL类由不同版本或实现处理。您编译的代码以某种方式传递了构建的对象,但SFML的编译版本以不同的方式解释此对象,从而导致问题。任何库都会发生这种情况。大多数只是避免这种情况,只是不允许你传递STL(或类似的)对象。