【问题标题】:SFML - Access violation reading location when saving RenderTexture to image 0xC0000005SFML - 将 RenderTexture 保存到图像 0xC0000005 时访问冲突读取位置
【发布时间】:2019-06-17 07:40:00
【问题描述】:

我正在使用 Visual Studio 2017。 调试时它指向第 11 行

texture.getTexture().copyToImage().saveToFile("C:/test.bmp");

有错误

在 Project2.exe 中的 0x54B06B9E (sfml-graphics-2.dll) 处引发异常: 0xC0000005:访问冲突读取位置0xCCE6C37F。

我想将纹理保存到 .bmp 文件。

#include<iostream>
#include<SFML/Graphics.hpp>

int main()
{
    using namespace sf;
    RenderTexture texture;
    texture.create(800, 600);
    texture.display();
    texture.clear(Color::Black);
    texture.getTexture().copyToImage().saveToFile("C:/test.bmp");

    return 0;
}

编辑

据我们检测到是 .saveToFile("C:/test.bmp") 片段导致了问题,没有它,代码可以正常工作

第二次编辑

我手动获取了 SFML 包,每次创建新项目并链接库时,我都会从一个设置的文件夹中包含它们,也可以通过外部 lib 文件夹手动添加

第三次编辑

经过一些工作,我设法修复了调试库和发布库,现在代码抛出异常

运行时检查失败 #2 - 变量“纹理”周围的堆栈已损坏。

包含整个输出和代码的屏幕截图:

另一件事是,当我继续而不处理它向我抛出的异常时:

Project2.exe 中 0x00D26859 处未处理的异常:堆栈 cookie 检测代码检测到基于堆栈的缓冲区溢出。

【问题讨论】:

  • 您可以通过分解最后一行来准确查看是哪一个调用导致了异常,从而使事情变得更容易。
  • @PaulMcKenzie 据我所知,它是 .saveToFile 函数,没有 .saveToFile 就可以正常运行
  • 你用管理员权限打开VS了吗?您是否尝试将其保存在另一个文件夹中,比C: 限制更少?也许My Documents 或类似的可以工作。
  • @alseether以管理员身份打开无效,将位置更改为“D:\output\test.bmp”也没有
  • docs 请注意“如果图像为空,此函数将失败。”。我认为这意味着该函数返回 false,但也许这意味着它调用了未定义的行为?尝试将texture.clear 行移到texture.display 之前。

标签: c++ opengl sfml access-violation


【解决方案1】:

我最好的猜测是您链接库的方式有些错误。 确保在调试配置中有调试库,在发布配置中有发布库。

请记住,调试库通常以“d”结尾。如果您没有正确设置调试库,您将无法调试您的代码,这可以解释为什么您会收到 poor 错误消息。

我留下here SFML 论坛的链接给遇到类似问题的人。

希望对您有所帮助。


作为旁注,对于使用 的初学者,我强烈建议使用 NuGet 包安装库(右键单击您的解决方案 -> 管理 NuGet 包 -> 查找 SFML -> 安装)

这适用于 SFML,不确定是否适用于 OpenGL。

【讨论】:

  • 所以我所做的是通过 NuGet 安装软件包,但这并没有太大帮助,尽管我怀疑您必须做更多的事情而不仅仅是按“安装”。我是 Visual Studio 的初学者,我在发布和调试配置下都有 opengl32.lib, sfml-graphics.lib, sfml-window.lib, sfml-system.lib,因为我没有找到任何 d 结尾的库
  • 其实就是这么简单。通过 NuGet 安装 SFML 应在解决方案文件所在的级别创建一个名为 packages 的文件夹。在该文件夹中是所有具有两个版本的软件包,Debug 和 Release。你不必担心链接的东西。只要确保你安装了所有你需要的包,通常需要windowgraphicssystem来绘图。如果您想分别进行音乐/声音或网络通信,请安装audionetwork
  • 我在我的 PC 上做了一些修改(我以前在我的笔记本电脑上工作过),然后我让它工作了。我将通过更新编辑我的帖子
【解决方案2】:

我找到了答案,问题是我没有使用为 VS 2017 编译的 .dll,而是使用为 2015 编译的那些,切换了它们,它就像一个魅力

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多