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

时间:2016-07-01 23:49:12

标签: c++ sfml access-violation

所以我正在尝试编写一个资源加载器和管理器(是的我知道Thor,这只是一个"学习"项目。)我已经开始尝试工会,而不是我经常使用的东西。我创建了一个名为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;
}

1 个答案:

答案 0 :(得分:2)

我猜想f是酉的。联合成员的内存区域重叠,除非您告诉编译器,否则只会初始化第一个成员。

您可以在构造函数中自行初始化它们,也可以使用placement new。

new (&f) sf::Font;

此外,破坏联合将导致问题,因为编译器不知道哪个成员要破坏,并且需要手动完成,如

f.~sf::Font();