面试经
什么时候释放的内存会“真正”被回收?
- 取决于内存管理器(如glibc的
malloc()或其它内存库)以及操作系统的调度策略。 - 一般来说,调用
free()后,内存变成“空闲状态”等待下一次分配,但不一定立即操作系统会释放这块物理内存。 
4. 总结
- 
在应用层面:
free()会马上标记内存为可用,但实际上“回收”意味着该内存可以被重新分配使用。 - 
在系统层面:
是否立即回收物理内存由操作系统内存管理策略决定,通常会在需要时和策略规则下进行实际回收。 
#pragma pack(4),或者在GCC中使用__attribute__((aligned(4)))
-g 和 -O3 选项本身在 GCC 中没有直接冲突。它们代表着不同的编译目标:
- 
-g: 添加调试信息(debugging information)到可执行文件中。这些信息使得像 GDB 这样的调试器能够将机器码指令与源代码中的对应行号、变量名等关联起来,方便程序调试。
 - 
-O3: 激活最高级别的代码优化。GCC 会进行各种激进的优化,例如循环展开、函数内联、指令重排等,以提高程序的运行效率。
 
为什么没有冲突?
- 
独立的目标: -g 影响的是编译器的输出内容,增加调试信息,而 -O3 主要影响编译器对代码的处理方式,进行各种优化。它们作用于编译的不同阶段和目标。
 - 
调试信息与优化: 调试信息可以存在于优化过的代码中。虽然优化可能会改变代码的结构和位置(例如,内联函数会移除函数调用),但编译器仍然可以尽量保留调试信息,以便调试器能够尽可能地将指令与源代码关联起来。
 
核心转储文件包含了程序在崩溃时的完整内存状态,包括:
- 
程序的内存布局:包括代码段、数据段、堆、栈等。
 - 
寄存器状态:所有寄存器的值,包含程序计数器(PC)、栈指针(SP)、帧指针(FP)等。
 - 
打开的文件描述符:程序打开的文件和其他资源的状态。
 - 
线程信息:所有线程的状态,包括每个线程的栈帧、寄存器状态等。
 
由于核心转储文件包含了程序崩溃时的完整状态,gdb能够加载这些信息并重现崩溃时的状态,从而进行详细分析。 gdb与核心转储文件一起使用时,通常需要程序的可执行文件(带有调试符号的版本)。调试符号提供了变量名、函数名、源代码行号等信息,这些信息对于理解程序的行为至关重要。 通过加载核心转储文件,gdb可以重现程序崩溃时的状态,结合符号信息、指令级调试、堆栈跟踪、内存检查和线程调试等功能,帮助开发者快速定位和解决复杂的问题。
                    
                
                
            
        
浙公网安备 33010602011771号