ctypes中的不同版本的msvcrt
在Windows系统中,当我导入ctypes模块时,ctypes.cdll.msvcrt
这个对象会自动存在,它代表的是微软的C++运行时库msvcrt
,具体可以参考文档。
不过,我注意到还有一个find_msvcrt函数,它会"返回Python使用的VC运行时库的文件名"
。
文档中进一步说明,"如果你需要释放内存,比如通过调用free(void *)释放一个扩展模块分配的内存,那么重要的是要使用同一个分配内存的库中的函数。"
所以我的问题是,ctypes.cdll.msvcrt
这个库和我可以通过find_msvcrt
函数加载的库有什么区别?在什么情况下它们可能不是同一个库呢?
1 个回答
不仅仅是 ctypes.cdll.msvcrt
自动存在,其实 ctypes.cdll.anything
也会自动存在,并且在第一次访问时会加载 anything.dll
。所以当你使用 ctypes.cdll.msvcrt
时,它会加载 msvcrt.dll
,这是Windows自带的一个库。需要注意的是,这个库并不是Python链接的C运行时,因此你不应该从 msvcrt
调用 malloc/free。
举个例子,对于Python 2.6和3.1,你应该使用 ctypes.cdll.msvcr90
。因为这个情况会随着时间变化,find_msvcrt()
可以告诉你应该使用哪个库的名字(然后通过 ctypes.CDLL
来加载它)。
这里有一些不同版本的Microsoft CRT的名字,它们在不同时间作为MSC、VC++、平台SDK或Windows的一部分发布:crtdll.dll, msvcrt.dll, msvcrt4.dll, msvcr70.dll, msvcr71.dll, msvcr80.dll, msvcr90.dll。