【发布时间】:2012-12-02 21:57:56
【问题描述】:
我有一个混合的 C/C++ 程序。它包含一个针对 C 的 flex/bison 解析器,而其余部分是 C++。
作为 C,生成的解析器和扫描器使用 malloc、realloc 和 free 管理它们的内存。它们足以暴露钩子,允许我提交我自己的这些函数的实现。如您所料,(C++)程序的其余部分“希望”使用new、delete 等。
做一些研究似乎表明相关标准并不能保证这种混合应该有效。特别是 C“堆”不一定是 C++“空闲区域”。看来这两个方案可以互相践踏。
除此之外,有一天(很快)这个程序可能会想要集成一个自定义的堆实现,例如 C 和 C++ 使用的 tcmalloc。
什么是“正确”的做法?
考虑到集成 tcmalloc(它解释了如何与 C 程序链接)的愿望,我很想在 C++ 内存管理中找到一些跨类型、跨线程、跨一切的重载/挂钩/任何东西。有了它,我可以将所有 C++ 分配/释放调用指向它们的 C 等价物(这反过来又落在 tcmalloc 上。)
这样的泛银河全局 C++ 钩子存在吗?可能它已经在做我想做的事了,类似于ios_base::sync_with_stdio 默认情况下秘密结合 iostream 和 stdio 的方式?
我对讨论 stdio 与 iostreams、切换解析器生成器或使用 C++ flex/bison 骨架(它们引入了独立的问题)不感兴趣。
编辑:请包含支持您的答案的 C++ 标准部分的名称。
【问题讨论】:
标签: c++ c memory-management malloc new-operator