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