c++ - CreateBuffer 抛出 "Access violation reading location"

标签 c++ visual-studio-2013 directx-11

我在名为 ModelClass 的类中有一个函数,它执行以下操作:

bool ModelClass::SetVertices(ID3D11Device* device, VertexType* vertices)
{
    // Error catching variable
    HRESULT result;

    // Setup the vertex buffer description
    D3D11_BUFFER_DESC vertexBufferDesc;
    ZeroMemory(&vertexBufferDesc, sizeof(vertexBufferDesc));
    vertexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
    vertexBufferDesc.ByteWidth = sizeof(vertices)*24; 
    vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    vertexBufferDesc.CPUAccessFlags = 0;
    vertexBufferDesc.MiscFlags = 0;
    //vertexBufferDesc.StructureByteStride = 0;

    // Give the subresource structure a pointer to the vertex data.
    D3D11_SUBRESOURCE_DATA vertexData;
    ZeroMemory(&vertexData, sizeof(vertexData));
    vertexData.pSysMem = vertices;
    vertexData.SysMemPitch = 0;
    vertexData.SysMemSlicePitch = 0;

    // Create the Vertex Buffer
    result = device->CreateBuffer(&vertexBufferDesc, &vertexData, &m_vertexBuffer);

    if (FAILED(result))
    {
        return false;
    }
    return true;

} 

运行它,给我一条错误消息“Engine.exe 中 0x00E445A2 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000。”,visual studio 指向 result = ...线。在我的一生中,我无法弄清楚为什么要这样做。我什至不知道还要发布什么,所以我将列举一些我认为相关的内容:

ModelClass::ModelClass(ID3D11Device* device, VertexType* vertices, unsigned long* indices)
{
    m_vertexBuffer = 0;
    m_indexBuffer = 0;

    SetVertices(device, vertices);
    SetIndices(device, indices);
}
  • 正在使用 ModelClass* cube1 = new ModelClass(d3d11Device, v, indices); 定义类,在全局范围内(目前),构造函数在上面的代码框中。
  • m_vertexBuffer变量声明为 ID3D11Buffer *m_vertexBuffer在类头文件中,并在类构造函数中初始化为零。
  • Visual Studio 2013、Windows 8.1 64 位上的 DirectX 11
  • 如果我将 SetVertices 函数的内容复制到我的主文件(其中包含大部分设置),它会立即运行而不会出现此错误。仅当我从类内部调用 CreateBuffer 时才会发生。这与我的索引缓冲区的工作方式完全相同,这表明它不是顶点结构的问题
  • 类的所有函数和变量都是公开的
  • CreateBuffer 仍然会抛出该异常,即使它的一个、多个或所有参数都设置为 NULL(即我认为这不是 m_vertexBuffer、数据或缓冲区描述的问题)
  • 我的主要猜测是它与类如何使用这些函数有关,但我找不到我的代码有任何问题

拜托,如果您想查看其余文件,请发表评论,如果有必要,我会把整个文件粘贴进来,这已经让我感到沮丧了

最佳答案

很棒的网站,RasterTek .

无论如何,问题是你在全局范围内初始化这个东西——在 d3d11Device 被初始化之前。当程序以任意顺序启动时,在全局范围内声明的所有内容都会立即创建。另一方面,d3d11Device 在程序启动时并未初始化。

将其移出全局范围或重新添加教程中的Initialize 函数。问题解决了。

关于c++ - CreateBuffer 抛出 "Access violation reading location",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21223337/

相关文章:

.net - 卸载 Visual F#

visual-studio - 在 Visual Studio 2013 中为 CUDA 7.0 启用语法高亮

c# - 未发现 EditorOptionDefinition 导出错误

c++ - 在模板类的头文件中包含 .cpp 文件

c++ - 与字符串相关

C++ move aligned_storage数组元素的正确方法

directx-11 - 使用 DirectXMath 高效计算法线

c++ - Direct3D 发现 2D 屏幕坐标有效,但在受到压力时出现镜像故障

c++ - D3D11 : How to draw GDI Text to a GXDI Surface?(无 D2D)

c++ - 通过 c/c++ 中的 tcp 套接字发送时数据被切断