CreateBuffer抛出“访问冲突读取位置”

时间:2014-01-19 22:08:47

标签: 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上的DirectX 11,Windows 8.1 64位
  • 如果我将SetVertices函数的内容复制到我的主文件(其中包含大部分设置),它会立即运行而不会出现此错误。只有当我从类中调用CreateBuffer时才会发生这种情况。这与我的索引缓冲区完全相同,这表明它不是顶点结构的问题
  • 班级的所有功能和变量都是公开的
  • 即使将一个,多个或全部参数设置为NULL,CreateBuffer仍会抛出该异常(即我认为这不是m_vertexBuffer,数据或缓冲区描述的问题)
  • 我的主要猜测是它与类如何使用这些函数有关,但我发现我的代码没有任何问题

请你,如果你想看到剩下的文件,只需发表评论,如果有必要,我会把整个事情粘贴到一起,这已经把我推到了墙上

1 个答案:

答案 0 :(得分:0)

很棒的网站,RasterTek

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

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