C++ 指针和数组
C++ pointers and arrays
动态数组有问题。
在头文件中 class 我有这个:
class CTerrain
{
...
CRock *rocks;
int numRocks;//=0
...
}
在 cpp 中我有这个:
void CTerrain::Create()
{
numRocks = 0;
int NUM_ROCKS = rand()%10+1;
for(int i=0;i<NUM_ROCKS;i++)
{
rocks = new CRock;
numRocks++;
...
}
}
void CTerrain::Render()
{
for(int i=0;i<numRocks;i++)
rocks[i].render();//it works ok when here is 0 instead of 'i'
}
当我 运行 此代码时出现错误:
OpenGL.exe 中 0x00913aea 处未处理的异常:0xC0000005:访问冲突读取位置 0x1c00001f。
感谢您的帮助,我已经尝试解决这个问题大约 4 个小时...
编辑:
好的,所以我将 Create() 方法更改为:
void CTerrain::Create()
{
numRocks = 0;
int NUM_ROCKS = rand()%10+1;
rocks = new CRock[NUM_ROCKS];
for(int i=0;i<NUM_ROCKS;i++)
{
rocks[i].position = ...
numRocks++;
...
}
并且还添加了 delete [] rocks,现在可以正常工作了。
您的 Create
函数更像是
void CTerrain::Create()
{
int NUM_ROCKS = rand()%10+1;
rocks = new CRock[NUM_ROCKS];
numRocks = NUM_ROCKS;
for(int i=0; i<NUM_ROCKS; i++)
{
rocks[i] = CRock{};
}
}
只是对上面的回答做一点解释。这里:
for(int i=0;i<NUM_ROCKS;i++)
{
rocks = new CRock;
numRocks++;
...
}
你所做的是,每次将 CRock
的 new 实例分配给指针 rock
;从而失去对旧对象的引用并造成内存泄漏。使用 Cyber 提供的类似建议的解决方案。
rocks = new CRock;
你一遍又一遍地覆盖了这一行中的CRock*
指针
使用这个
rocks = new CRock[NUM_ROCKS];
首先,rocks 是指向 CRocks 的指针。你的实施:
rocks[i].render() 应该是这样的:
rocks = 新 CRock [x]; (其中 x 是 CRock 类型对象的数量。)
rocks[i] -> render().
delete rocks[i] // 一定要删除。
您可能需要参考 this 以获取有关如何处理动态对象数组的解决方案。
另一个reference不错。
动态数组有问题。
在头文件中 class 我有这个:
class CTerrain
{
...
CRock *rocks;
int numRocks;//=0
...
}
在 cpp 中我有这个:
void CTerrain::Create()
{
numRocks = 0;
int NUM_ROCKS = rand()%10+1;
for(int i=0;i<NUM_ROCKS;i++)
{
rocks = new CRock;
numRocks++;
...
}
}
void CTerrain::Render()
{
for(int i=0;i<numRocks;i++)
rocks[i].render();//it works ok when here is 0 instead of 'i'
}
当我 运行 此代码时出现错误: OpenGL.exe 中 0x00913aea 处未处理的异常:0xC0000005:访问冲突读取位置 0x1c00001f。
感谢您的帮助,我已经尝试解决这个问题大约 4 个小时...
编辑:
好的,所以我将 Create() 方法更改为:
void CTerrain::Create()
{
numRocks = 0;
int NUM_ROCKS = rand()%10+1;
rocks = new CRock[NUM_ROCKS];
for(int i=0;i<NUM_ROCKS;i++)
{
rocks[i].position = ...
numRocks++;
...
}
并且还添加了 delete [] rocks,现在可以正常工作了。
您的 Create
函数更像是
void CTerrain::Create()
{
int NUM_ROCKS = rand()%10+1;
rocks = new CRock[NUM_ROCKS];
numRocks = NUM_ROCKS;
for(int i=0; i<NUM_ROCKS; i++)
{
rocks[i] = CRock{};
}
}
只是对上面的回答做一点解释。这里:
for(int i=0;i<NUM_ROCKS;i++)
{
rocks = new CRock;
numRocks++;
...
}
你所做的是,每次将 CRock
的 new 实例分配给指针 rock
;从而失去对旧对象的引用并造成内存泄漏。使用 Cyber 提供的类似建议的解决方案。
rocks = new CRock;
你一遍又一遍地覆盖了这一行中的CRock*
指针
使用这个
rocks = new CRock[NUM_ROCKS];
首先,rocks 是指向 CRocks 的指针。你的实施: rocks[i].render() 应该是这样的:
rocks = 新 CRock [x]; (其中 x 是 CRock 类型对象的数量。)
rocks[i] -> render().
delete rocks[i] // 一定要删除。
您可能需要参考 this 以获取有关如何处理动态对象数组的解决方案。
另一个reference不错。