C/C++编程中的内存管理、循环优化与结构应用
1. Oracle RDBMS与C/C++垃圾回收器
在探索Oracle RDBMS的过程中,为了研究其漏洞等信息,需要对其函数中的大型嵌套对象进行处理。由于Oracle RDBMS是一款庞大的软件,典型函数可能会接收非常大的嵌套对象作为参数,因此希望将这些对象以树或图的形式进行转储。
为了实现这一目标,通过拦截内存分配和释放函数来跟踪所有的内存分配和释放操作。当被拦截的函数获得一个指向内存块的指针时,会在已分配的内存块列表中查找该块,并获取其大小和简短名称,类似于Windows操作系统内核中的“标记”操作。
在不同的操作系统(32位或64位)上,会扫描内存块中的32位或64位字。每个字都可能是指向另一个内存块的指针,如果在记录中找到该块,就可以递归地处理它。最后,使用GraphViz工具来渲染这些对象的图形表示。
对于C/C++的垃圾回收器,以Boehm GC为例。如果一个内存块被使用,其地址必须以某种方式存在,比如作为另一个已分配块中的某个结构或数组中的指针,或者在全局分配的结构中,又或者在栈中的局部变量里。如果没有指针指向某个内存块,就可以称其为“孤立块”,这会导致内存泄漏。
Boehm GC会扫描所有已分配的内存块以查找指针,但它并不知道这些内存块中所有结构字段的数据类型。它只是将已分配的内存块和栈视为字数组,其中一些字可能是指针。如果发现某个已分配的内存块是“孤立块”,即没有其他块或栈中的指针指向它,就会认为该块不再需要并释放它。不过,扫描过程需要时间,这也是垃圾回收器常被批评的地方。
此外,像Boehm GC(用于纯C)有 GC_malloc_at
超级会员免费看
订阅专栏 解锁全文

313

被折叠的 条评论
为什么被折叠?



