资源联合引发 SFML 中字体的访问冲突
Resource union throws access violation for Fonts in SFML
所以我正在尝试编写一个资源加载器和管理器(是的,我知道 Thor,这只是一个 "learning" 项目。)并且我已经开始尝试联合,而不是我经常使用的东西。我创建了一个名为 resource 的 class(如下面的代码所示),它有一个包含 texture/font 的联合。纹理加载正确;但是字体会引发访问冲突
Exception thrown at 0x00C5DBE0 in Project.exe: 0xC0000005: Access violation reading location 0x00000004.
以下是我完整的最小示例。编辑::更新的代码解决了这个问题。 Evan 在下面解释说,这是因为只有联合中的第一个元素是默认构造的。
#include <SFML/Graphics.hpp>
class Resource
{
public:
union
{
sf::Texture t;
sf::Font f;
};
Resource(sf::Font font = sf::Font()) : f(font)
{ }
~Resource()
{ }
};
int main()
{
Resource font;
Resource tex;
if (!tex.t.loadFromFile("player.png")) {} //! Works great!
//doError
if (!font.f.loadFromFile("blocks.ttf")) {} //! Throws access violation.
//doError
return 0;
}
我猜 f
是单元化的。联合成员的内存区域重叠,除非您另外告诉编译器,否则只有第一个成员被初始化。
您可以在构造函数中自行初始化它们,也可以使用 placement new。
new (&f) sf::Font;
另外,解构union也会出问题,因为编译器不知道要解构哪个成员,需要像
一样手动完成
f.~sf::Font();
所以我正在尝试编写一个资源加载器和管理器(是的,我知道 Thor,这只是一个 "learning" 项目。)并且我已经开始尝试联合,而不是我经常使用的东西。我创建了一个名为 resource 的 class(如下面的代码所示),它有一个包含 texture/font 的联合。纹理加载正确;但是字体会引发访问冲突
Exception thrown at 0x00C5DBE0 in Project.exe: 0xC0000005: Access violation reading location 0x00000004.
以下是我完整的最小示例。编辑::更新的代码解决了这个问题。 Evan 在下面解释说,这是因为只有联合中的第一个元素是默认构造的。
#include <SFML/Graphics.hpp>
class Resource
{
public:
union
{
sf::Texture t;
sf::Font f;
};
Resource(sf::Font font = sf::Font()) : f(font)
{ }
~Resource()
{ }
};
int main()
{
Resource font;
Resource tex;
if (!tex.t.loadFromFile("player.png")) {} //! Works great!
//doError
if (!font.f.loadFromFile("blocks.ttf")) {} //! Throws access violation.
//doError
return 0;
}
我猜 f
是单元化的。联合成员的内存区域重叠,除非您另外告诉编译器,否则只有第一个成员被初始化。
您可以在构造函数中自行初始化它们,也可以使用 placement new。
new (&f) sf::Font;
另外,解构union也会出问题,因为编译器不知道要解构哪个成员,需要像
一样手动完成f.~sf::Font();