【发布时间】:2018-11-23 03:45:56
【问题描述】:
我正在尝试在运行时 dlopen 内存分配器。
我对libc、tcmalloc 和tbbmalloc 没有任何问题。但是尝试dlopen jemalloc 会导致以下错误(通过dlerror 捕获):
/path/to/lib/libjemalloc.so: cannot allocate memory in static TLS block
您知道这个错误的原因以及我该如何解决这个问题吗?
【问题讨论】:
-
我不认为这些库被设计为使用
dlopen开放。 -
在您拥有的 jemalloc 版本中似乎存在问题。在任何情况下,将动态库加载下界 dlopen 或 LoadLibrary 用于内存分配器都不是一个好主意。想象一下,当你在分配器已经卸载时调用
free函数时会发生什么。而是将共享库链接到可执行文件。 -
@SergeyA 你说的不是“设计为与
dlopen开放”是什么意思? @VictorGubin 我知道这个陷阱。我正在尝试设计一个子系统,以便能够在同一程序中使用多种分配策略。因此,链接共享库是不够的,确保使用好的分配器释放分配的内存是程序设计的一部分。 -
它们被设计为通过动态加载器自动链接,并在程序开始执行之前可用。
-
必须使用
dlsym()来检索分配器动态库提供的calloc()、free()、malloc()和realloc()函数和要非常小心,不要使用另一个分配器的功能释放或重新分配一个分配器提供的指针。
标签: c++ c memory-management dlopen jemalloc