您的位置:首页 > 其它

Windows程序的模块之间为什么不能使用STL容器作为参数

2013-02-27 13:27 381 查看
理论基础:

1、Windows平台的C Runtime Library(以下简称CRT)分为两种:Multi-threaded和Multi-threaded DLL。前者是静态库,会被链接到目标程序中;后者是动态库,目标程序运行时才加载。

2、Windows堆内存分为两类:默认堆和私有堆。默认堆可以在同一进程内跨模块访问;私有堆只能在所属模块中访问。

3、STL使用new操作符分配内存,new操作符最终会调用HeapAlloc API在名为_crtheap的私有堆上进行分配。

由此可见,Multi-threaded DLL程序可以安全地跨模块传递STL参数,因为所有的内存分配、释放都在DLL模块中(前提是同一版本的CRT动态链接库);而Multi-threaded程序如果跨模块传递STL参数的话,则会出现A中分配、B中释放的问题,造成程序崩溃。

通常,一个软件由多个模块组成,各个模块链接CRT的方式和版本可能不一样。因此,一个健壮的软件不应在模块间使用STL参数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: