跨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。
如果哪位有更好的解决方案或者建议,望不吝赐教,鄙人自感激涕零!
浙公网安备 33010602011771号