我在传递指向函数的指针数组时遇到问题。
类CTree01是CDecorationObj的子级。当我使用for循环时,它工作正常。
这是我的代码:
CTree01 *trees01;
int numTree01 = ...;
trees01 = new CTree01[numTree01];
//main loop
for(int i=0;i<numTree01;i++)
{
{
//Everything is working okay here, renders all trees
glPushMatrix();
trees01[i].DrawOnTerrain(camera);
glPopMatrix();
}
}
但是由于我用一个函数代替了它,所以它不再起作用了:
void DrawDecorationType(CDecorationObj* objs, int number, CCamera *camera)
{
int x,z;
for(int i=0;i<number;i++)
{
{
glPushMatrix();
objs[i].DrawOnTerrain(camera);
glPopMatrix();
}
}
}
//main loop
DrawDecoration(trees01, numTree01, camera);
当我执行该功能时:
objs[0].DrawOnTerrain(camera);
它有效,并且仅当我渲染索引> 0的对象时才会崩溃,因此我认为传递给函数的参数一定有问题。
让我看看是否可以使用几个简单的类来解释问题。
假设您有:
struct Foo
{
char a;
};
struct Bar : Foo
{
char b;
};
sizeof(Foo)
是1
并且sizeof(Bar)
是2
。
然后Bar
使用以下方法创建对象数组:
Bar* barPtr = new Bar[2];
barPtr
指向的内存布局如下所示:
Bar(0) Bar(1)
| |
v v
+---+---+---+---+
| a | b | a | b |
+---+---+---+---+
如果将该指针传递给函数a Foo*
,则该函数会将内存解释为(因为sizeof(Foo) == 1
):
Foo(0)
| Foo(1)
| |
v v
+---+---+
| a | a |
+---+---+
如您所见,Foo(1)
它并不是真正的Foo
对象。确实是的Bar
子对象Bar(0)
。这很容易导致不确定的行为。根据基类和派生类所具有的数据类型,它很容易使程序崩溃。
关键点是,指向派生类对象数组的指针不能被视为指向基类对象数组的指针。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句