内存相关崩溃:Cocos2d 游戏中的 3 维数组

Memory Related Crash : 3 Dimensional Array in Cocos2d Game

提问人:Guru 提问时间:4/16/2019 更新时间:4/19/2019 访问量:43

问:

这是代码:

.h 中的声明

@interface LevelManager : NSObject{

}
@property int ***construtorDeMundo;

初始化和 malloc

-(id)init {
    self = [super init];
    if(self != nil){
        construtorDeMundo = (int***) malloc ( NUMFASES * sizeof(int *));

        for (int i = 0; i < NUMFASES ; i++) {
            construtorDeMundo[i] = (int**) malloc (MAX_PONTOS_CRITICOS * sizeof(int));
        }

        for (int i = 0; i < NUMFASES; i++)
            for (int j = 0; j < MAX_PONTOS_CRITICOS; j++) {
                construtorDeMundo[i][j] = (int*) malloc (PROPRIEDADES * sizeof(int));
                for (int k = 0; k < PROPRIEDADES ; k++)
                    construtorDeMundo[i][j][k] = 0;
            }

        [self pegaInformacoes];
    }
    return self;
}

访问代码:

 for (int j = 1; j < [elements count]; j++) {
            if(j <= PROPRIEDADES+1){
                NSString *valor = (NSString *)[elements objectAtIndex:j];
                construtorDeMundo[fase][i][j-1] = [((NSNumber*)valor) intValue];
            }
        }

游戏在最后一个函数中因不同的索引而随机崩溃。与malloc有关的东西...怎么修?如果你知道,请帮帮我。

对不起,这个游戏代码不是英文的......不是我写的。

提前致谢。

C++ C iPhone Xcode Cocos2D-iphone

评论

1赞 The Quantum Physicist 4/16/2019
我该从哪里开始...1. 永远不要手动分配数组,使用 std::vector。2. 不要将 3D 数组分配为 ,而是创建一个大小适合所有三个维度的一维数组,并使用自定义访问器来到达元素。这速度更快,缓存友好。a[i][j][k](i,j,k)
0赞 Guru 4/16/2019
@TheQuantumPhysicist是的,您的建议很棒,并且在谷歌上也听到了......但是在这个游戏中,这个关卡经理在很多地方都使用了......所以把它改成矢量可能需要很多天......所以在上面的分配中寻找实际问题。
2赞 The Quantum Physicist 4/16/2019
除了我之前提到的,我看不出代码有什么问题。使用 Valgrind 或一些类似的内存分析工具来找出答案。顺便说一句,信不信由你,将其更改为向量可能会更便宜。它现在是你的代码。修复它可能不仅仅是修复两条线。问题是需要多长时间,而不是你要改变多少行。
0赞 Guru 4/16/2019
谢谢你的好话,先生......会尽力而为...一个奇怪的观察结果是它在 32 位设备中完美运行......仅在 64 位中出现问题。换句话说,在 iOS7 中运行良好,现在在 iOS12 中只是崩溃了......将研究更多...感谢

答:

0赞 Guru 4/17/2019 #1

最后解决了问题。在上面的代码中,为 sizeof() 提供了错误的值。

以下是更新后的代码:

-(id)init {
    self = [super init];
    if(self != nil){
        construtorDeMundo = (int***) malloc ( (NUMFASES) * sizeof(*construtorDeMundo));

        for (int i=0; i < NUMFASES; ++i)
            construtorDeMundo[i] = NULL;

        for (int i = 0; i < NUMFASES ; ++i) {
            construtorDeMundo[i] = (int**) malloc (MAX_PONTOS_CRITICOS * sizeof(*construtorDeMundo[i]));
        }

        for (int i=0; i < NUMFASES; ++i)
            for (int j=0; j < MAX_PONTOS_CRITICOS; ++j)
                construtorDeMundo[i][j] = NULL;

        for (int i = 0; i < NUMFASES; ++i)
            for (int j = 0; j < MAX_PONTOS_CRITICOS; ++j) {
                construtorDeMundo[i][j] = (int*) malloc ((PROPRIEDADES) * sizeof(*construtorDeMundo[i][j]));
                for (int k = 0; k < PROPRIEDADES ; k++)
                    construtorDeMundo[i][j][k] = 0;
            }


        [self pegaInformacoes];
    }
    return self;
}