C++ 资源联合引发对SFML中字体的访问冲突
因此,我正在尝试编写一个资源加载器和管理器(是的,我知道Thor,这只是一个“学习”项目)。我已经开始尝试使用工会,而不是我经常使用的东西。我创建了一个名为resource的类(如下面的代码所示),它有一个包含纹理/字体的联合。纹理加载正确;但是,字体会引发访问冲突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. 下面是我完整的、最少
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…
addnew(&font.f)sf::font代码>我将在哪里放置新的(&f)sf::Font代码>?在构造函数中,还是在联合体中?或者在主功能中?在main
之前的font.f.loadF…
addnew(&font.f)sf::font代码>