我在一个名为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;

}


运行此命令,会给我一个错误消息,提示“ Visual Studio指向result = ...行,Engine.exe中0x00E445A2的未处理异常:0xC0000005:访问冲突读取位置0x00000000。”。对于我的一生,我无法弄清楚为什么这样做。我什至不知道还要发布什么,所以我只列举一些我认为相关的东西:

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时才会发生。这与我的索引缓冲区的工作方式完全相同,这表明顶点结构没有问题
该类的所有函数和变量都是公共的
即使将一个,多个或所有参数设置为NULL,CreateBuffer仍会引发该异常(即,我认为m_vertexBuffer,数据或缓冲区描述不存在问题)
我的主要猜测是,它与类如何使用这些函数有关,但是我的代码找不到任何错误


拜托,如果您想查看其余文件,请发表评论,如果有必要,我将粘贴整个内容,这已经使我无所适从

最佳答案

很棒的网站,RasterTek

无论如何,问题在于您正在初始化d3d11Device之前在全局范围内初始化此东西。当程序以任意顺序启动时,将立即创建在全局范围内声明的所有内容。另一方面,d3d11Device在程序启动时未初始化。

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

关于c++ - CreateBuffer抛出“访问冲突读取位置”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21223337/

10-11 18:26