我正在使用DirectX,我有一个函数可以提供预定义的自定义顶点数组,它是
CUSTOMVERTEX* createSampleTriangle()
{
CUSTOMVERTEX verts[] =
{
{320.0f, 50.0f, 0.5f, 1.0f, D3DCOLOR_ARGB (0, 255, 0, 0), },
{250.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_ARGB (0, 0, 255, 0), },
{50.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_ARGB (0, 0, 0, 255), }
};
return verts;
}
现在,我拿起这样的结果:
CUSTOMVERTEX *v = createSampleTriangle();
但是当我逐行调试时,我看到v下只有一个顶点,即使顶点显示3个顶点。该程序并没有崩溃,但是当出现问题时,DirectX再也无法渲染,它只是跳过该功能。
知道为什么会这样吗?该函数是否不返回具有由v?
处理的分配内存的指针答案 0 :(得分:3)
您返回指向当您返回时已停止存在的本地自动对象的指针。
那种未定义的行为,被称为悬空指针。
制作该对象static
,或动态分配它或其他东西。我会去使用std::vector
。
答案 1 :(得分:2)
我在此处看到的问题是,verts
具有自动存储持续时间,并且是函数createSampleTriangle()
的本地存储时间。返回它的地址并因此稍后使用它将调用undefined behaviour。
详细说明,verts
仅存在于为createSampleTriangle()
分配的堆栈中。一旦此函数完成执行,则不存在verts
。因此,使用调用函数中createSampleTriangle()
的返回值( pointer )将会出错并导致UB。