乐业成就人生

跨dll/process时std::map中内存被破坏的处理方案

我遇到的问题是这样:

项目中的一个dll,有一个接口Meshing(CParameter & parameter),CParameter 有一个数据成员类型为 std::map<...>,

当在一个process中调用该接口,传递parameter时,在process中parameter中的std::map<...>成员正常,但进入到dll中后,发现parameter中的std::map<...>的内容不可访问,其内存好像被破坏了。但回到process中后,std::map<...>的内容又能够正常访问。

以前就有这样的忠告:不要跨dll/process传递stl对象,存在内存无法正常访问的潜在风险。

果然,这次让我碰上了。应验了那句:常在河边走,哪有不湿鞋!

怎么解决呢?采取了一个折衷方案:Wrapper,在传递前Wrapper(...),将map转换成普通的链表;在传递完后,在UnWrapper(...)一下,将普通链表转换成map,以便于数据的检索和引用。

其实我觉得最终方案还是应该:在跨dll/process时,接口间数据的传递应该远离 stl 容器。

关于这个问题,

微软的解释:
http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b172396


微软给的解决办法:
http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b168958

 

如果哪位有更好的解决方案或者建议,望不吝赐教,鄙人自感激涕零!

posted on 2009-03-16 08:29  阿郑  阅读(1185)  评论(0)    收藏  举报