资源联合抛出SFML中字体的访问冲突
Resource union throws access violation for Fonts in SFML
所以我试着写一个资源加载器和管理器(是的,我知道雷神,这只是一个"学习"项目),我已经开始尝试联合,不是我经常使用的东西。我创建了一个名为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();
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 读取访问冲突.这0xCDCDCDCD
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 插入数组时违反写访问冲突
- 使用 ReadProcessMemory 获取字符串值的访问冲突
- 尝试通过共享指针使用变量时读取访问冲突
- 堆栈上的 C++ 访问冲突写入异常
- 引发异常:写访问冲突. temp 为 nullptr
- 将静态字符数组中的字符分配给动态分配的字符数组 - 访问冲突
- 更改字体颜色时违反 SFML 访问冲突
- 资源联合抛出SFML中字体的访问冲突