- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用一种非常 .NET 风格的方法为 C++ 构建一个内存管理器。在这样做时,我需要知道哪些对象被认为是可达的;如果一个可达对象有相关对象的句柄,则对象被认为是可达的。所以这就提出了一个问题,哪些对象是我们搜索的根?答案是这些“eve”对象在堆栈上,无论是托管对象句柄的形式,还是本身具有托管对象句柄的范围本地对象实例的形式。
我已经阅读了一些关于此的文章,并在 MSDN 上查看了有关 Win32 API 中 StackWalk 方法的实现细节。
与往常一样,非常感谢任何帮助。并且请不要建议不要制作内存管理器,或建议替代方案,例如智能指针。我完全明白我在做什么。谢谢!
最佳答案
您的要求似乎类似于我目前正在处理的一个小项目,但我的目标不是制作内存管理器,我的目标是检测 dmalloc(以及 Debug模式的长时间运行的应用程序,它在其中正在运行)能够定期停止执行并扫描内存以查找没有引用的堆分配。有点像“愚蠢的”垃圾收集器,但不是以释放内存为目标;相反,目的是记录泄漏的分配以供以后分析(以及在分配时捕获的堆栈跟踪,我已将其添加到 dmalloc)。请注意,作为通用内存管理器的垃圾收集器,这将是一个非常低效的过程,并且需要“很长时间”才能运行(我还没有完成,但如果每次运行它我都不会感到惊讶停止正常程序执行超过 10 秒),但出于我自己的目的,我不太关心性能,因为我每隔几个月只启用一次,以测试我公司产品中的新内存泄漏。
无论如何,我假设您的内存管理器将是您的应用程序中堆内存的唯一来源?并且您系统中的线程在完全共享的内存环境中运行,其中没有线程拥有任何其他线程无法看到的内存,包括堆栈空间和线程本地存储空间?如果是这样...
我相信只有四类内存,您可以在其中找到指向堆分配的指针:
void*
每个分配的地址和一个单独的位数组(不是
bool
数组),每个分配有一个位,初始化为全零,如果您找到对它的潜在引用,则分配的相应位设置为 1。当您扫描垃圾收集时,这仍然会给您 O(log n) 查找(使用二分搜索),但是您的查找具有更易于管理的比例常数;此外,这种更紧凑的数据结构往往比平衡树具有更好的缓存命中性能。
void*
的平面阵列。分配地址,单独列出“考虑使用中”分配和“尚未验证”分配。扫描“考虑使用中”的分配,寻找仍然在“尚未验证”列表中的分配的潜在指针。当您找到任何内容时,将它们从“尚未验证”列表移到“考虑使用中”列表的末尾,以便您最终也可以扫描它们。
关于Windows 上的 C++ 堆栈遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13848412/
我是一名优秀的程序员,十分优秀!