SFML中的Segfault

问题描述 投票:0回答:2

我正在尝试使用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上使用它。

c++ sfml
2个回答
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-s docs here的更广泛的解释。


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(或类似)对象来避免这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.