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++;
            ...
 }

你所做的是,每次将 CRocknew 实例分配给指针 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不错。