我知道 gdb 允许您打印使用print <exp>. 然后可以重复使用此结果(通过$N)。现在假设我有以下功能:
const char* foo(){ return "foo";}
char* foo2(){static char b[10]; /*change b*/; return b}
char* foo3(){char* b; /*Create string on heap*/ return b;}
gdb 对命令结果有什么作用print foo(), print foo2(), print foo3()?它将如何释放这些变量,这种清除会导致错误吗?
在前两种情况下,没有什么可以释放的。在这些情况下,所有数据都有一个静态存储类。它们都从程序启动的那一刻起就存在,并将继续存在直到它完成。
在第三种情况下,什么都不会被释放。调用的副作用 - 动态内存分配 - 将“存活”到程序执行结束,就好像该函数是从您的代码中正常调用的一样。(顺便说一句,这在调试时很有用 - 如果有人“忘记”分配内存,那么可以通过调用 from 手动分配
gdb并继续执行。)换句话说,调试器根本不会尝试释放它自己没有分配的东西。它只是打印函数的结果,而不用担心其他任何事情。