re: 在跨模块调用中传递stl容器的问题。 psysun 2005-12-11 23:30
再连接时用动态方式链接运行库就能避免了。vc里就是/MD
re: 在跨模块调用中传递stl容器的问题。 psysun 2005-11-28 19:23
和动态链接没关系,重要的是共享运行时库。
因为stl容器都是以头文件形式定义的,所以每个模块编译后都至少有一份stl代码,在上面的例子里operator+=就是在dll.obj模块里,而~string()代码在de.obj,他们都使用了allocator<>,这个模版最后会用malloc和free管理内存,这时如果有一个模块静态链接了运行库,那么堆就不是唯一的,就会出异常了。
stl容器在分配内存时会根据算法用malloc分配一个比需要更大的内存,free掉原来的内存,用new(p) value_type(x)构造新对象,调用的是拷贝构造函数,用p->~value_type()析构对象。
re: 在跨模块调用中传递stl容器的问题。 psysun 2005-11-24 17:39
和多线程库没关系,是连接方式的问题。
总的原则是:在跨模块的接口里如果有用非常量stl容器引用作为参数的函数,那么就要保证这两个模块都用动态连接运行库方式连接的。用指针传递参数时分配和释放不再同一模块也有同样的问题。