C语言 在尝试free() struct成员之前确定它是否有有效的数据



我使用下面的代码来释放meshes结构中的malloc ed内存,其中包含triangleArraysfaces

这个崩溃是因为不是struct中的每个位置都有数据。我想做的是,只有当struct包含数组成员的数据时,才调用free。然而,使用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指针都是不同的指针。只允许在malloc 'd指针上调用free一次。例如,像这样:
    Int * p = (Int *) malloc(sizeof(Int));自由(p);自由(p);//未定义行为之前会导致崩溃。

下面的代码会崩溃,因为不是结构体中的每个位置都有数据。

不,它不会因为传递一个NULL指针给free()而崩溃。如果传入一个NULL指针,什么也不会发生,请参阅文档。

抛出什么错误?向我们展示你的初始化代码,也就是说,你是如何分配faces和它上面的所有东西的?您可能将一些坏的/未初始化的数据传递给free()

顺便说一句,由于你问这个问题的方式,我相信你认为简单地声明一个数组将用NULL填充每个元素。情况并非如此,它们可能填充任何东西,如果您将其传递给free,您将崩溃(如果您幸运的话)。

triangleArrays数组是如何创建的?非分配成员是否可能包含垃圾而不是NULL?

相关内容

  • 没有找到相关文章

最新更新