C/C++编程中的内存管理、循环优化与结构使用技巧
1. Oracle RDBMS与简单垃圾回收器
曾经有人尝试深入了解Oracle RDBMS,查找其漏洞等。Oracle RDBMS是一款庞大的软件,典型函数可能会接受非常大的嵌套对象作为参数。为了深入分析,作者想将这些对象以树或图的形式转储出来。
操作步骤
- 跟踪内存分配与释放 :通过拦截内存分配和释放函数,跟踪所有内存分配和释放操作。当被拦截的函数获取到内存块的指针时,在已分配的内存块列表中查找该块,并获取其大小和简短名称,类似于Windows操作系统内核中的“标记”操作。
- 扫描内存块 :对于给定的内存块,在32位操作系统上扫描32位字,在64位操作系统上扫描64位字。每个字都可能是指向另一个内存块的指针,如果是,则递归处理该块。
- 生成图表 :使用GraphViz渲染这些图表。
虽然作者没有关于所有这些结构的数据类型的信息,但仍能从中获取一些有用的信息。
垃圾回收器Boehm GC
在C/C++中,如果使用一个在内存中分配的块,其地址必须以某种形式存在,比如在另一个已分配块的某个结构/数组中作为指针,或者在全局分配的结构中,或者在栈中的局部变量中。如果没有指向某个块的指针,就可以称其为“孤儿块”,这会导致内存泄漏。
Boehm GC的工作原理如下:
1. 扫描内存块 :它会扫描所有已分配的内存块,查找指针。