春暖花开
雪化了,花开了,春天来了
posts - 149,comments - 125,trackbacks - 0

疑惑,很是疑惑的一个问题。

下午我遇到这么一个问题,我在程序里静态加载一个dll,这个dll是我自己写的。我把dll在release环境下编译,简称为A吧,另一个程序是在debug环境下进行编译的,简称为B吧。B会调用A,但是在调用中就出错了。

A 中调用B的代码如下:

std::vector<ITEMDATA> vcData;

GetValue(vcData);



B 中的代码为
   

void GetValue(std::vector<ITEMDATA> &vcData)
{
   ……
    ITEMDATA item;
   ……
    vcData.push_back(item);
    ……
}

但是程序每走完GetValue后就抛异常了。

但是如果两个环境都为debug,或都为release的话,都正常,但是如果不同的话,就会出错。

比较郁闷了。
posted on 2009-01-05 19:16 Sandy 阅读(2382) 评论(7)  编辑 收藏 引用 所属分类: windows学习

FeedBack:
# re: 关于debug和release的一点疑惑
2009-01-05 19:45 | windead
release版本与debug版本所使用的runtime library是不同的,当你的DLL与程序是用不同的方式编译后,将加载两个不同的runtime library,因此程序会出现异常情况。
如果一定到使用不同的编译方式,建议DLL使用C接口。  回复  更多评论
  
# re: 关于debug和release的一点疑惑
2009-01-05 23:02 | 空明流转
楼上解释了问题的原因。
不过即便用C,malloc/free不用一个runtime也很容易出问题。

跨dll的stl container通常需要自定制allocator。

不过如果是同样的crt可以不定制allocator。
甚至mingw的gcc和vc的交叉调用只要用了同样的crt也可以不定制的。
当然也是因为mingw的stl和vc的stl很相近。

不过这个只是特例而已。  回复  更多评论
  
# re: 关于debug和release的一点疑惑[未登录]
2009-01-05 23:24 | yzzrn
debug vector allocator与release vector allocator不是一个东西。  回复  更多评论
  
# re: 关于debug和release的一点疑惑
2009-01-06 01:08 | 陈梓瀚(vczh)
因为,dll和exe的new和delete是不能跨边界的,而且你那个是模板,所以dll和exe都有代码。所以我建议你的dll提供allocator给exe用,否则别在接口处使用模板容器。  回复  更多评论
  
# re: 关于debug和release的一点疑惑
2009-01-06 08:28 | guest
debug vector allocator与release vector allocator不是一个东西。
--------------------------------
同意,因为debug下,vector会包含很多调试信息,就不一样了。  回复  更多评论
  
# re: 关于debug和release的一点疑惑
2009-01-06 10:29 | Sandy
呵呵,谢谢各位指点.

debug vector allocator与release vector allocator不是一个东西。



  回复  更多评论
  
# re: 关于debug和release的一点疑惑
2009-01-08 13:51 | getborn
我原来也碰到过,最后解决方法是让vector的分配和销毁内存的位置在一起:

A的调用代码:

std::vector<ITEMDATA>** pData;

GetValue(&pData);


B 中的代码为


void GetValue(std::vector<ITEMDATA> **pData)
{
……
ITEMDATA item;
……
vcData.push_back(item); // vcData为成员变量
(*pData) = &vcData;
……
}  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理