注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

widebright的个人空间

// 编程和生活

 
 
 

日志

 
 

stl的兼容性问题vc6和vc2008的sizeof(std::string) 大小不一致  

2012-01-11 20:15:41|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

上篇文章说道跟踪windows程序的崩溃信息。最后发现是stl的版本不一致导致的问题。

       问题是这样的,第三方的exe和dll是用vc6.0编译的,好像我们也没有相应的源码。结果我们用vc2008来编译我们的类似插件的dll时是不能正确运行的,但用vc6.0编译就可以。大家都知道vc6.0太久了,很难用的,在我的windows xp3上面,那个“附加到进程”的调试功能一直不能显示进程列表,看msdn说是由于api变动导致的问题,说是新版6.0能用,但我没能找到一个正确的版本。所有我最近测试都是用 vc6.0 的cl.exe来编译,然后用vc2008的link.exe来链接,最后在2008中调试。

       今天看了一下用vc2008编译不能运行的问题,发现是std::string在vc6.0和vc2008里面的不同实现造成的。vc6.0里面的sizeof(string) 等于16 ,但vc2008里面的sizeof(string)等于32。 我们有一段个头文件是用来引用第三方的dll里面的接口的

  

Class B;

class  A{

private:

   string  s1;

   string  s2;

   B status;

public:

inline  B * getStatus () {

     return &status; 

};

 

然后我们插件的代码有一个函数由第三方的dll调用的,他传了一个A 的指针过来

 void  func ( A * a ) {

     B * b = a->getStatus();  //因为string的大小关系,exe里面建的对象时是用vc6编译的,我们的vc2008编译的获取的status的偏移地址就不对了。 

     b->function();  //在这里就会崩溃了, b已经是非法指针了,后的行为都是非定义的了,最后程序在strcmp访问b的元素时异常了。

}

 

 

      整个问题就可能设计的时候没考虑的这么清楚,所以接口的基类里面采用几个std::string的元素,但这种std::string的实现在不同的stl库里面实现各种各样的形式很多,c++并没有对这些做规定。结果在vc6和vc2008里面不同时,就发生问题了。其实他完全可以定义char[] 字符数组来做接口里面使用,这样就不会有这些兼容问题了。接口里面还是使用基本的c++类型就好了!!!

      记得看“顶级程序员心得”那本书的时候,有个家伙就把他们 的Netscape浏览器失败的一个重要原因归结为使用stl,然后不同的编译器有不同的stl实现,最后维护还是什么和困难。看来这个还是有点道理的,想这种类型大小不统一的问题很多,C++相比较C又隐藏了很多细节,很容易引入很多很难被发现的问题。

 

  评论这张
 
阅读(1076)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017