访问冲突直接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更新方法的主要内容,如果未能解决你的问题,请参考以下文章