我使用下面的代码来释放meshes
结构中的malloc
ed内存,其中包含triangleArrays
和faces
。
这个崩溃是因为不是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?