我试图使用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上使用它。
答案 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::Window
或sf::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(或类似的)对象。