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参数。
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参数。
相关文章推荐
- 为什么auto_ptr智能指针不能作为STL标准容器的元素
- 为什么auto_ptr智能指针不能作为STL标准容器的元素
- STL容器类型作为模块参数传递的问题 解决方案
- 为什么不能使用成员变量的值作为成员函数的默认参数?
- php的mysql_prepare不能使用表明一类级作为参数
- 为什么类型参数不能作为静态变量的类型
- common lisp 中宏定义时不能使用#'? 形式的函数作为参数
- auto_ptr智能指针不能作为STL标准容器的元素
- c++构造函数不能使用本class对象作为参数
- 使用模板省略号参数模仿 STL 容器的 emplaceback
- Python陷阱:为什么不能用可变对象作为函数的默认参数值
- java类中用类的数组作为函数参数传给类,为什么不能直接对类的数组进行操作?
- STL 作为参数 跨模块调用 问题
- 使用HQL语句的按照参数名字查询数据库信息的时候 “=:”和参数之间不能存在空格,否则会报错
- STL容器之间可以直接相互赋值使用
- 契约操作不能使用引用对象作为参数,只允许使用基本类型或数据契约
- stl容器跨模块使用的陷阱
- pthread_exit ---- 不能使用局部变量作为参数返回
- stl容器之--自定义结构体作为stl容器元素成员的使用
- js 不能直接将 console.log 作为参数使用