我想重现一个问题,先决条件是设置系统"Out of memory"然后检查进程的行为方式.
在不影响其他用户的情况下,我必须模拟这个问题,因为许多其他用户并行使用Linux机器.
realloc可以返回相同的输入地址或不同的地址.如果它返回一个不同的地址,那么它将在内部解除分配/释放输入内存并将该内容移动到另一个位置并返回该新地址.
请考虑以下情况.
new_ptr = realloc (2000, 10000) // Lets assume the input address is 2000
// Lets assume the new_ptr address is 3000
Run Code Online (Sandbox Code Playgroud)
因此,内部realloc将释放指针指向2000的内存并将这些数据移动到新位置3000并返回3000地址.
现在地址2000指向无效.因此,reallocAPI 未将其分配给NULL .
现在,将该无效地址传递给realloc函数.实时可能存在realloc可能获得无效输入地址的更改.
new_ptr = realloc(2000, 10000)
Run Code Online (Sandbox Code Playgroud)
此2000地址无效,因为它已被前一个释放realloc.现在程序崩溃了.
我可以通过以下方式解决此问题.
if (new_ptr != old_ptr ) {
old_ptr = NULL;
}
Run Code Online (Sandbox Code Playgroud)
由于old_ptr无效.我将它分配给NULL.请确认我的更正.