资源联合抛出SFML中字体的访问冲突

Resource union throws access violation for Fonts in SFML

本文关键字:字体 访问冲突 SFML 资源      更新时间:2023-10-16

所以我试着写一个资源加载器和管理器(是的,我知道雷神,这只是一个"学习"项目),我已经开始尝试联合,不是我经常使用的东西。我创建了一个名为resource的类(如下面的代码所示),它有一个包含纹理/字体的联合。纹理加载正确;然而,字体抛出访问冲突

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是初始化的。联合成员的内存区域是重叠的,除非你告诉编译器,否则只有第一个成员被初始化。

你可以在构造函数中自己初始化它们,或者使用位置new。

new (&f) sf::Font;

同样,析构联合也会导致问题,因为编译器不知道要析构哪个成员,并且需要像

那样手动完成。
f.~sf::Font();