C++ SFML-将RenderTexture保存到图像0xC0000005时访问冲突读取位置

C++ SFML-将RenderTexture保存到图像0xC0000005时访问冲突读取位置,c++,opengl,sfml,access-violation,C++,Opengl,Sfml,Access Violation,我正在使用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

我正在使用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;
}
#包括
#包括
int main()
{
使用名称空间sf;
渲染纹理;
创建(800600);
texture.display();
质地:透明(颜色:黑色);
texture.getTexture().copyToImage().saveToFile(“C:/test.bmp”);
返回0;
}
编辑 据我们所知,是
.saveToFile(“C:/test.bmp”)
片段导致了问题,没有它,代码工作正常

第二次编辑 我手动获得了SFML包,每次创建新项目时,我都从一个集合文件夹中包含它们,并链接库,还通过外部lib文件夹手动添加它们

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

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

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

另一件事是,当我继续而不处理异常时,它会向我抛出以下内容:

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


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

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

我给有类似问题的人留下了SFML论坛的链接

希望有帮助


另外,对于初学者,我强烈建议使用NuGet软件包安装库(右键单击解决方案->管理NuGet软件包->查找SFML->安装)


这适用于SFML,但不一定适用于OpenGL。

我找到了答案,问题是我没有使用为VS 2017编译的DLL,而是使用为2015编译的DLL,切换了它们,效果很好

您可以通过分解最后一行来查看到底是哪一个调用导致了异常,从而使事情变得更容易。@PaulMcKenzie据我所知,这是.saveToFile函数,没有它运行得很好。saveToFile是否使用管理员权限打开了VS?您是否尝试将其保存在另一个文件夹中,限制性比
C:
小?也许
My Documents
或类似的功能可以工作。@另外,以管理员身份打开的另一个操作不起作用,将位置更改为“D:\output\test.bmp”,但请注意“如果图像为空,此功能将失败。”。我认为这意味着函数返回false,但可能意味着它调用了未定义的行为?尝试移动
纹理。清除
纹理之前的
行。显示
。因此,我所做的是通过NuGet安装软件包,但这没有多大帮助,尽管我怀疑您需要做的不仅仅是按“安装”。我是Visual Studio的初学者,在release和debug配置下都有
opengl32.lib、sfml-graphics.lib、sfml-window.lib、sfml-system.lib
,因为我没有任何可以找到的d端库,所以就这么简单。通过NuGet安装
SFML
应该在解决方案文件所在的级别创建一个名为
packages
的文件夹。该文件夹中包含所有版本为Debug和Release的包。你不必担心链接东西。只需确保您正在安装所需的所有软件包,通常绘图需要
窗口
图形
系统
。如果您想分别进行音乐/声音或网络通信,请安装
音频
网络
。我将用更新来编辑我的帖子