【发布时间】: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 指针传递给它。
标签: c++ pointers memory directx