phs*_*phs 16 c c++ malloc memory-management new-operator
我有一个混合的C/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与iostreams以及切换解析器生成器以及使用C++ flex/bison骨架(它们引入独立的头痛)并不感兴趣.
编辑:请包括支持您的答案的C++标准的那些部分的名称.
pax*_*blo 27
该标准确实保证混合两种分配变体将起作用.什么是不容许的事情就像调用free上的内存,来自new,因为他们可能会使用完全不同的舞台为两种类型.
如果你记得为给定的内存块调用正确的释放函数,你会没事的.如果你遵守规则他们不会互相践踏,如果你不遵守规则,那么从技术上讲,你是在践踏,而不是他们:-)
C++ 11标准的控制部分是20.6.13 C library哪些状态,转述:
calloc,malloc,free和realloc设置,基于C标准.::operator new()或::operator delete().根据你最终提出的建议,第二个要点是有趣的,接下来tcmalloc替换C遗产函数并让C++也使用它.
标准中有一个脚注,解释了为什么他们不使用let malloc()调用::operator new():
目的是通过调用std :: malloc()或std :: calloc()来实现operator new().换句话说,他们希望避免循环依赖.
然而,虽然它允许 operator new()调用malloc(),但我不确定标准实际上是否需要它.因此,为了安全起见,您可能希望注入tcmallocC 和 C++区域.
你已经表明你已经知道如何为C做了.对于C++,可以通过简单地operator new()/delete()在代码中提供整套全局函数来完成,适当地编写为tcmalloc在封面下调用.C++标准声明3.7.4 Dynamic storage duration:
该库提供全局分配和释放功能的默认定义.一些全局分配和释放功能是可替换的.
C++程序最多只能提供一个可替换分配或释放功能的定义.任何此类函数定义都将替换库中提供的默认版本.
以下分配和释放函数在程序的每个转换单元中的全局范围中隐式声明:
void* operator new(std::size_t);void* operator new[](std::size_t);void operator delete(void*);void operator delete[](void*);