来自c ++中动态加载库的指针
Pointers from dynamic loaded library in c++
我知道动态加载的库共享相同的地址space,但我不确定在动态加载的库中分配内存并关闭库时会发生什么。当对象不是加载库的一部分时,分配的对象是否仍然有效?例如一个简单的 std::string 或任何我的 类?
(我持 Linux 观点;C++14 标准不了解动态加载库)
你的C++程序只有一个heap (and a single virtual address space) for the entire process运行。因此,在低级别上,可以从一个库 lib1.so
分配内存区域并从另一个库 lib2.so
释放内存区域 - 在同一进程中。
您可以有多个进程使用相同的共享库;然后该库的文本或 code segment 在多个进程之间有效共享(但不是数据段)。
剩下的就是编程约定。五的规则(以前是 rule of three)是 C++
中一个非常有用的约定
内部,mmap(2) is used, and the address space can be seen with /proc/$PID/maps
(see proc(5))。因此,对于 pid 1234 的进程,请在终端中尝试 运行 cat /proc/1234/maps
,您将更多地了解如何在该进程的虚拟地址 space 中加载共享库。
Is the allocated object still valid when the object is not a part of the loaded library?
也许吧。
在 UNIX 系统上,不 包含指向已加载库的任何指针的 heap-allocated 对象肯定是有效的(因为堆是 process-global 资源)。
然而,在C++
中,一个heap-allocated对象可能包含一个虚拟table指针,它将指向共享库中的.code
,如果这样的库完全卸载后,此虚拟 table 指针将失效。该对象仍然是可寻址的,您可以访问它的数据和 non-virtual 方法,但尝试调用虚方法可能会崩溃。
在 Windows 系统上,DLL
可以链接到共享的 C 运行时 MSVRT.DLL
、 或 以及 "local" C 运行时的副本(LIBCMT.LIB
,等等)。更多信息 here。正如该页面所解释的那样,当使用 statically-linked CRT
时,从中分配的资源(包括堆)对于此 DLL 是本地的。特别是,卸载这样的 DLL
将 销毁 heap-allocated 从 DLL
堆中分配的对象。
我知道动态加载的库共享相同的地址space,但我不确定在动态加载的库中分配内存并关闭库时会发生什么。当对象不是加载库的一部分时,分配的对象是否仍然有效?例如一个简单的 std::string 或任何我的 类?
(我持 Linux 观点;C++14 标准不了解动态加载库)
你的C++程序只有一个heap (and a single virtual address space) for the entire process运行。因此,在低级别上,可以从一个库 lib1.so
分配内存区域并从另一个库 lib2.so
释放内存区域 - 在同一进程中。
您可以有多个进程使用相同的共享库;然后该库的文本或 code segment 在多个进程之间有效共享(但不是数据段)。
剩下的就是编程约定。五的规则(以前是 rule of three)是 C++
中一个非常有用的约定内部,mmap(2) is used, and the address space can be seen with /proc/$PID/maps
(see proc(5))。因此,对于 pid 1234 的进程,请在终端中尝试 运行 cat /proc/1234/maps
,您将更多地了解如何在该进程的虚拟地址 space 中加载共享库。
Is the allocated object still valid when the object is not a part of the loaded library?
也许吧。
在 UNIX 系统上,不 包含指向已加载库的任何指针的 heap-allocated 对象肯定是有效的(因为堆是 process-global 资源)。
然而,在C++
中,一个heap-allocated对象可能包含一个虚拟table指针,它将指向共享库中的.code
,如果这样的库完全卸载后,此虚拟 table 指针将失效。该对象仍然是可寻址的,您可以访问它的数据和 non-virtual 方法,但尝试调用虚方法可能会崩溃。
在 Windows 系统上,DLL
可以链接到共享的 C 运行时 MSVRT.DLL
、 或 以及 "local" C 运行时的副本(LIBCMT.LIB
,等等)。更多信息 here。正如该页面所解释的那样,当使用 statically-linked CRT
时,从中分配的资源(包括堆)对于此 DLL 是本地的。特别是,卸载这样的 DLL
将 销毁 heap-allocated 从 DLL
堆中分配的对象。