如果在函数内部调用 free() ,它是否只在本地释放?
If free() is called inside a function, does it only free locally?
仍在学习分配和解除分配的诀窍,我对某些事情感到好奇。
假设您为数组分配内存:
int *array = malloc(5 * sizeof(int));
您将数组发送到一个函数并在那里重新分配它。函数参数必须是指向数组(或 &array)的双指针,否则重新分配只会在本地发生。
如果你还想在另一个函数中释放(解除分配)数组,它是否也必须是双指针?函数中的释放只会发生在本地吗?如果不是,它在这方面与重新分配有何不同?
不,free()
全局释放内存,就像malloc()
全局分配内存一样。也就是说,内存已分配,并且只要指向它的指针可访问(函数参数、函数 return 值、全局变量),它就会无限期地保持分配和可访问状态——直到被释放或程序退出(或者程序退出)泄漏;不再有指向内存的有效可访问指针)。并且已释放的已分配内存将无限期释放。它可能会通过另一个分配再次可用,但这是巧合。
如果您将指向已分配内存的指针传递给函数并且该函数释放了它,则它会被释放以供调用代码使用。调用代码需要知道被调用函数释放了内存,因此它不会在释放后尝试使用内存。
仍在学习分配和解除分配的诀窍,我对某些事情感到好奇。
假设您为数组分配内存:
int *array = malloc(5 * sizeof(int));
您将数组发送到一个函数并在那里重新分配它。函数参数必须是指向数组(或 &array)的双指针,否则重新分配只会在本地发生。
如果你还想在另一个函数中释放(解除分配)数组,它是否也必须是双指针?函数中的释放只会发生在本地吗?如果不是,它在这方面与重新分配有何不同?
不,free()
全局释放内存,就像malloc()
全局分配内存一样。也就是说,内存已分配,并且只要指向它的指针可访问(函数参数、函数 return 值、全局变量),它就会无限期地保持分配和可访问状态——直到被释放或程序退出(或者程序退出)泄漏;不再有指向内存的有效可访问指针)。并且已释放的已分配内存将无限期释放。它可能会通过另一个分配再次可用,但这是巧合。
如果您将指向已分配内存的指针传递给函数并且该函数释放了它,则它会被释放以供调用代码使用。调用代码需要知道被调用函数释放了内存,因此它不会在释放后尝试使用内存。