仍在学习分配和释放的绳索,我对某些事情感到好奇。
假设您为数组分配内存:
int *array = malloc(5 * sizeof(int));
您将数组发送到函数并在那里重新分配。函数参数必须是指向数组(或数组)的双指针,否则重新分配只能在本地进行。
如果你还想在另一个函数中释放(解除分配)数组,它是否也必须是一个双指针?在一个函数中释放只会在本地发生吗?如果没有,它与该方面的重新分配有何不同?
不,free()
在全球范围内释放内存,就像malloc()
在全球范围内分配内存一样。也就是说,内存被分配,如果可以访问它的指针(函数参数,函数返回值,全局变量),它将无限期地保持分配和可访问 - 直到释放或程序退出(或它被泄露;没有更长的有效可访问内存指针)。释放的已分配内存将无限期释放。它可能会被另一个分配再次提供,但这是巧合。
如果将指向已分配内存的指针传递给函数并且该函数释放它,则会释放调用代码。调用代码需要知道被调用的函数释放了内存,因此它在释放后不会尝试使用内存。