Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 资源联合引发对SFML中字体的访问冲突_C++_Sfml_Access Violation - Fatal编程技术网

C++ 资源联合引发对SFML中字体的访问冲突

C++ 资源联合引发对SFML中字体的访问冲突,c++,sfml,access-violation,C++,Sfml,Access Violation,因此,我正在尝试编写一个资源加载器和管理器(是的,我知道Thor,这只是一个“学习”项目)。我已经开始尝试使用工会,而不是我经常使用的东西。我创建了一个名为resource的类(如下面的代码所示),它有一个包含纹理/字体的联合。纹理加载正确;但是,字体会引发访问冲突 Exception thrown at 0x00C5DBE0 in Project.exe: 0xC0000005: Access violation reading location 0x00000004. 下面是我完整的、最少

因此,我正在尝试编写一个资源加载器和管理器(是的,我知道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;
}
#包括
类资源
{
公众:
联盟
{
sf::纹理t;
sf::字体f;
};
资源(sf::Font=sf::Font()):f(Font)
{                                            }
~Resource()
{         }
};
int main()
{
资源字体;
资源tex;
如果(!tex.t.loadFromFile(“player.png”){}/!工作得很好!
//多罗
如果(!font.f.loadFromFile(“blocks.ttf”){}/!抛出访问冲突。
//多罗
返回0;
}

我猜
f
是单元化的。联合成员的内存区域重叠,除非您告诉编译器其他情况,否则只初始化第一个成员

您可以自己在构造函数中初始化它们,也可以使用新的placement来初始化它们

new (&f) sf::Font;
此外,破坏联合会也会导致问题,因为编译器不知道要破坏哪个成员,需要像这样手动完成

f.~sf::Font();

我猜
f
是单位化的。联合成员的内存区域重叠,除非您告诉编译器其他情况,否则只初始化第一个成员

您可以自己在构造函数中初始化它们,也可以使用新的placement来初始化它们

new (&f) sf::Font;
此外,破坏联合会也会导致问题,因为编译器不知道要破坏哪个成员,需要像这样手动完成

f.~sf::Font();

如果没有sf::Texture和sf::Font的定义,就不可能知道发生了什么,但我猜f的构造是不正确的,它们是SFML库的一部分。正如我在上面所做的那样,它确实可以用默认构造函数构造。您是否尝试过查看问题是SFML类还是您对它们的使用?我试图用
字符串和
向量实现您的问题,但我自己也遇到了问题。如果你能用stl重现这个问题,你可以接触到更广泛的听众——工会成员的记忆区域重叠。只有第一个得到默认构造,如果有剩余内存,它就充满了垃圾。看来我确实必须通过这样做显式构造
f
Resource(sf::Font=sf::Font()):f(Font)
。有人知道为什么会这样吗?(我正在更新主要帖子)编辑:正如我发布这篇文章时埃文解释的那样。非常感谢。如果没有sf::Texture和sf::Font的定义,就不可能知道发生了什么,但我猜f的构造是不正确的,它们是SFML库的一部分。正如我在上面所做的那样,它确实可以用默认构造函数构造。您是否尝试过查看问题是SFML类还是您对它们的使用?我试图用
字符串和
向量实现您的问题,但我自己也遇到了问题。如果你能用stl重现这个问题,你可以接触到更广泛的听众——工会成员的记忆区域重叠。只有第一个得到默认构造,如果有剩余内存,它就充满了垃圾。看来我确实必须通过这样做显式构造
f
Resource(sf::Font=sf::Font()):f(Font)
。有人知道为什么会这样吗?(我正在更新主要帖子)编辑:正如我发布这篇文章时埃文解释的那样。非常感谢。我将把
new(&f)sf::Font?在构造函数中,还是在联合体中?或者在主功能中?在
main
之前的
font.f.loadF…
add
new(&font.f)sf::font我将在哪里放置新的(&f)sf::Font?在构造函数中,还是在联合体中?或者在主功能中?在
main
之前的
font.f.loadF…
add
new(&font.f)sf::font