我想知道当一个系统如何释放内存时,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声明指针的副本可能导致内存异常?进一步讨论.