访问冲突直接x更新方法

Posted

技术标签:

【中文标题】访问冲突直接x更新方法【英文标题】:Access violation direct x update method 【发布时间】:2014-06-06 18:09:42 【问题描述】:

我在 utube 上遵循了 dirextX 9 教程,并尝试修改程序以根据一组点显示多个三角形。我将它用作一种绘图仪。在我的测试中,我在我的绘图仪类中生成了一个点列表。然后绘图仪类生成 3 个顶点以围绕该点创建一个小三角形。然后将这些点传递给 directx 设备。

我已将生成多边形的代码移到我的更新方法中,因为我需要用新的多边形更新多边形列表。 该代码有效,但时不时会崩溃并显示以下错误消息

DX3DPlotTest.exe 中 0x010F6AF1 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000。

我认为问题与反复调用 memcpy 命令有关。我试过删除 pVert 但这会产生自己的错误,因为 pVert 从未启动。

听说是我的更新版本

`
void TestApp::Update(float dt)

    void *pVerts;
    plotter=new Plotter(MaxPoints,0.01f);
    float x,y;
    for(ULONG i=0;i<MaxPoints;i++)
     
        x= (float)(distribution(generator)-2.0f);
        y= (float)(distribution(generator)-2.0f);
        plotter->Plot(x,y);
    
    m_pDevice3D->CreateVertexBuffer(
        plotter->listContentCount*sizeof(VertexPositionColor),
        0,VertexPositionColor::FVF,
        D3DPOOL_MANAGED,
        &VB,
        NULL
        );
    //d3d vertex buffer VB
    VB -> Lock(0,sizeof(VertexPositionColor)*plotter->listContentCount, (void**)&pVerts, 0);
    memcpy(pVerts,plotter->m_pVertexList,sizeof(VertexPositionColor)*plotter->listContentCount);
    VB -> Unlock();

`

请有人帮助我了解如何解决此问题?如果一直在摆弄它几个小时。它确实有效,但时间有限。 谢谢大家。

编辑:

好的,现在我决定重新创建我的绘图仪实例

`

Plotter::Plotter(UINT PointCount,float pointsize)
    
        listSize            =   PointCount*3;
        listContentCount    =   0;
        bufferContentCount  =   0;
        Polycount           =   0;
        m_pStdtri           =   new VertexPositionColor[3];
        m_pVertexList       =   new VertexPositionColor[listSize];
        m_pStdtri[0]        =   VertexPositionColor(0.0f                    ,1.0f*pointsize     ,d3dColors::Red);
        m_pStdtri[1]        =   VertexPositionColor(1.0f*pointsize          , -1.0f*pointsize   ,d3dColors::Lime);
        m_pStdtri[2]        =   VertexPositionColor(-1.0f*pointsize         , -1.0f*pointsize   ,d3dColors::Red);
    
    Plotter::~Plotter()
    
        delete(m_pStdtri);
        delete(m_pVertexList);

    
    void Plotter::Plot(float x, float y)
    
        Polycount++;
        m_pVertexList[listContentCount]=VertexPositionColor(x+m_pStdtri[0].x, y+m_pStdtri[0].y,d3dColors::Red);
        listContentCount++;
        m_pVertexList[listContentCount]=VertexPositionColor(x+m_pStdtri[1].x, y+m_pStdtri[1].y,d3dColors::Lime);
        listContentCount++;
        m_pVertexList[listContentCount]=VertexPositionColor(x+m_pStdtri[2].x, y+m_pStdtri[2].y,d3dColors::Blue);
        listContentCount++;
    

`

【问题讨论】:

这里的内存泄漏 - plotter=new Plotter(MaxPoints,0.01f) - 我在任何地方都看不到你 delete plotter "访问冲突读取位置 0x00000000。"意味着您正在尝试在某处读取 NULL 指针。与重复调用 memcpy() 无关,除非您将 NULL 指针传递给它。 【参考方案1】:

这里有几件事可能是错误的。绘图仪对象似乎从未被处置,但它有可能在其他地方完成。然而,困扰我的是你一遍又一遍地调用 CreateVertexBuffer,大概没有释放你正在使用的资源。所以在我看来,基本上发生的事情是:在每一帧中,你都会创建一个新的 VertexBuffer。由于 GPU 上的内存不足,该命令最终会失败,您没有检测到并尝试使用“已创建”缓冲区,该缓冲区并未真正创建。您需要知道,即使您删除了包含 VB 变量的对象,缓冲区也不会被破坏。 CreateVertexBuffer 命令占用 GPU 上的资源,因此在不再需要时需要显式释放它们。但是,让我们回到正题。此功能有时会失败。因此会导致 NULL 指针错误。我的建议是只创建一次缓冲区,然后只在每一帧中更新它。但首先,请确定是否是这种情况。

【讨论】:

谢谢你,我相信这是要走的路。我已将 CreateVertexBuffer 调用移至 init 方法。但这会在 VB -> Lock(0,sizeof(VertexPositionColor)*plotter->listContentCount, (void**)&pVerts, 0); 上创建访问冲突你知道为什么吗? 我已经使用这个答案修复了它。谢谢你这么快的回复。

以上是关于访问冲突直接x更新方法的主要内容,如果未能解决你的问题,请参考以下文章

私有化

私有化

私有化

私有化

由于密钥冲突 VBA SQL 访问,更新失败

SSE 访问冲突