【发布时间】:2018-05-24 07:18:38
【问题描述】:
在处理内存分配、valgrind 和 gdb 时,我不得不编写一个带有无效 free 的简单 c 程序:
#include <stdlib.h>
#include <stdio.h>
int main (void)
{
int* arr = (void*) malloc(100 * sizeof(int));
arr[50] = 10;
free(arr + (20 * sizeof(int)));
printf("arr[50] = %d\n", arr[50]);
return 0;
}
根据需要产生错误:
*** Error in `./allocWithFunnyFree': free(): invalid pointer: ... ***
======= Backtrace: =========
...
======= Memory map: ========
...
然后我尝试通过将sdtout 和stderr 重定向到/dev/null 来消除输出,但注意到输出仍然会被打印出来,这让我感到困惑。
我在使用调试器调用free() 之前停止了程序一条指令,查找了/proc/PID/fd 目录并再次尝试将所有列出的fd 重定向到/dev/null,但结果仍然相同..
我在网上搜索了答案并询问了我的一些同事,但没有人能向我解释这个输出是如何打印的以及为什么它不能被重定向。
当然,关于操作系统/linux,我还有很多不知道的地方,但我希望你能帮助我了解这里发生了什么。
谢谢!
【问题讨论】:
标签: c linux memory-management linux-kernel free