我还可以对一个对其进行第二次malloc()调用的变量调用free()吗?

Hun*_*yer 4 c memory malloc

我想知道当一个系统如何释放内存时,malloc()调用是否与你分配malloc()的初始变量绑定在一起.

例如,我可以执行以下操作:

void * ptr1 = malloc(50);
void * ptr2 = ptr1;
ptr1 = malloc(25);
free(ptr2);
Run Code Online (Sandbox Code Playgroud)

我打算释放最初分配给ptr1 的内存,但后来用另一个指针释放它.

Cha*_*ffy 11

让我们一步一步地介绍(UNDEF意味着我们不知道值是什么; valid意味着指针可以安全使用):

void *ptr1, *ptr2;    /* ptr1=UNDEF (invalid), ptr2=UNDEF (invalid) */
ptr1 = malloc(50);    /* ptr1=0xAAA (valid),   ptr2=UNDEF (invalid) */
ptr2 = ptr1;          /* ptr1=0xAAA (valid),   ptr2=0xAAA (valid)   */
ptr1 = malloc(25);    /* ptr1=0xBBB (valid),   ptr2=0xAAA (valid)   */
free(ptr2);           /* ptr1=0xBBB (valid),   ptr2=UNDEF (invalid) */
Run Code Online (Sandbox Code Playgroud)

free()不知道它传递的指针存储在哪个变量中; 不保证(但也不保证)以任何方式更新变量或与变量交互.从应用程序开发人员的角度来看,所有有效改变的是,实际使用该指针是否安全,或者在malloc()返回它的调用期间分配给内存块的任何其他引用是否安全.

正如@MM 在注释中所提到的,C语言规范是明确的,指向未释放对象的指针的值是未定义的,并允许编译器以任何方式修改它; 请参阅为什么MISRA C声明指针的副本可能导致内存异常?进一步讨论.