C++ 在dlsym之后调用dlclose安全吗

C++ 在dlsym之后调用dlclose安全吗,c++,c,linux,macos,C++,C,Linux,Macos,来自Windows,我习惯于在获得指向符号的指针后关闭DLL的句柄。这与使用dl函数时相同吗?在下面的示例中,在调用dlclose之后,我是否仍然能够使用myFunction?如果不是,打电话给dlclose是否重要 void* handle = dlopen ("someLibrary", 0); if (handle) { myFunction = dlsym (handle, "MyFunction"); dlclose (handle); } dlclose关闭共享库(

来自Windows,我习惯于在获得指向符号的指针后关闭DLL的句柄。这与使用dl函数时相同吗?在下面的示例中,在调用dlclose之后,我是否仍然能够使用myFunction?如果不是,打电话给dlclose是否重要

void* handle = dlopen ("someLibrary", 0);
if (handle)
{
    myFunction = dlsym (handle, "MyFunction");
    dlclose (handle);
}

dlclose
关闭共享库(假设它是对它的唯一引用),这意味着操作系统将取消对共享库的映射,并且
MyFunction
很可能不再位于内存中

当然,如果您执行
handle=dlopen(“someLibrary”,0);handle2=dlopen(“someLibrary”,0)
,则可以
dlclose(句柄)和库仍然是“活动的”,因为还有另一个对它的引用(
handle2
)仍然是活动的

当然,不能保证操作系统会立即取消映射它,它可能会作为后台进程来执行,因此它可能会在关闭后立即调用它,但不会在0.5秒或类似的时间内调用它。没有任何规范规定它必须这样做或那样做,只是说明它不再有效

如果您只打开一个库,请在整个程序中使用它,那么在退出之前调用
dlclose
可能不是必需的,但是如果您打开了很多库(例如,在长时间运行的程序中使用某种插件,该程序可以/将使用许多不同的插件,如果您不调用
dlclose
,该程序可能会耗尽虚拟地址空间


(所有共享库在退出时都是关闭的,因此在退出时保持其打开状态应该不是问题)

当然,只要您不打算调用
myFunction
…这在使用dl函数时是相同的吗?是的,LoadLibrary()/FreeLibrary()具有相同的语义,您很幸运没有体验到未映射库的后果。您的观点很好,我认为我没有受到影响的唯一原因是因为我使用的库是普通库(即kernel32等)。是的,当然,如果应用程序已经在使用共享库/DLL,它仍将保持打开状态-毕竟每个进程中只有一个共享库的实际副本[至少不需要花费大量的工作让操作系统多次加载它]是的,在osx库中使用dispatch_一次使dlclose变得不可能。但我相信没有人会在意,因为它是应用程序服务。