我使用下面的代码来释放malloc结构中的meshesed内存,它包含triangleArraysfaces
这会崩溃,因为并非struct中的每个位置都有数据。我只想在free包含数组中该成员的数据时调用struct。但是使用if (self.meshes[meshIdx].triangleArrays[triangleArrayIdx].faces !=NULL)似乎不起作用。

for (int meshIdx = 0; meshIdx <=meshTriangleArrays; meshIdx ++) {
    for (int triangleArrayIdx = 0; triangleArrayIdx <=1; triangleArrayIdx ++) {
        if (self.meshes[meshIdx].triangleArrays[triangleArrayIdx].faces !=NULL) {
            free(self.meshes[meshIdx].triangleArrays[triangleArrayIdx].faces);
        }
    }
}

最佳答案

对空指针调用free实际上是可以的。
您没有提供足够的代码来完全诊断此问题,但需要注意以下几点:
您需要确保self.meshes[...].triangleArrays[...].faces始终是初始化的,可以通过调用malloc(或其他方式)或将其设置为NULL。否则,它可能(而且很可能)是一个您没有free权限的随机垃圾指针。
您需要确保所有不同的self.meshes[...].triangleArrays[...].faces指针都是不同的指针。您只允许在一个指针上调用一次free。例如,如下所示:int*p=(int*)malloc(sizeof(int));
自由(p);
free(p);//未定义的行为
会导致撞车。

10-05 22:40