stl容器类型作为参数传递的问题

degel 2011-05-17 11:23:25
近日遇到一个比较匪夷所思的问题,由于工程比较复杂,我把问题简化描述如下,如果有类似情况的朋友们可以交流下解决方案。

此问题只在vs2008下出现。


一个函数为 void Fun(int i1,int i2,int i3,int i4, std::list<OBJECT>& rlist )
{

……
}

其中struct OBJECT
{
int m1;
int m2;
}

当有一个函数为:
void CallFunc(int i1,int i2,int i3,int i4, std::list<OBJECT>& rlist )
{
//调用Fun
Fun( i1, i2, i3, i4, rlist );

}

调用前各个参数并无异常,调用后进入函数Fun时前面所有int类型函数正常,唯独std::list参数错误,
具体表现为内部数据错误(比如rlist.front直接导致程序当掉),list大小变成非常夸张的数字;

另外,当我把最后一个参数类型改成VECTOR<object>等容器也依旧出现类似问题。

不知道我描述得是否详细,烦请大家看看,谢谢
...全文
575 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
FengQingYang2008 2011-05-24
  • 打赏
  • 举报
回复
你的跨模块调用,是不是,不同的模块,使用了不同的编译器版本来编译?stl库在vc下面有这么个毛病,当用来编译dll,作为参数或者返回值的时候,就容易出现这个问题。原因有那么几个:

1.不同版本的stl实现不一样,导致list、vector等内部数据结构不一样,这样在不同版本的模块中传递时,数据结构就会不正确

2.std::alloc的问题,也就是内部内存在不同的模块里面进行分配,并不是使用同一个内存池,当在一个模块内申请,在另一个模块释放的时候也会出问题

解决办法,所有的dll和exe使用同一个版本的编译器,并且动态链接到C运行时dll上
雪人2015 2011-05-23
  • 打赏
  • 举报
回复
那就追踪你要引用对象了,这是很痛苦的!
degel 2011-05-20
  • 打赏
  • 举报
回复
已经做了,那样的话是没有问题的

[Quote=引用 22 楼 xujiezhige 的回复:]
我的意思是因为多模块的缘故,所以让你把单模块涉及到的多模块的东西全都包括到一个模块来,然后进行测试。
[/Quote]
雪人2015 2011-05-19
  • 打赏
  • 举报
回复
我的意思是因为多模块的缘故,所以让你把单模块涉及到的多模块的东西全都包括到一个模块来,然后进行测试。
degel 2011-05-18
  • 打赏
  • 举报
回复
一致,出自同一个头文件

[Quote=引用 19 楼 q191201771 的回复:]
不同模块的话OBJECT结构体的声明是否一致呢
[/Quote]
degel 2011-05-18
  • 打赏
  • 举报
回复
你的意思是写一个类似的函数传递STL容器指针作为参数么?
“你测试在同一模块写这两个函数没问题吗?”
这句话听起来有点拗口,呵呵



[Quote=引用 18 楼 xujiezhige 的回复:]
简化的工程下成功,并不一定在你现在的情况就没问题!
不过这也是猜测。

因为没法真正了解情况,记得模块间的内存释放有时没弄好就很麻烦。《windows核心编程》里面就指出过一个模块申请的内存要本模块释放,也避免不必要的bug。这里只是举个例子。

而且以前我也碰到过比较离奇的问题。所以模块间的一些暗藏的bug是十分令人头疼的!

你测试在同一模块写这两个函数没问题吗?
[/Quote]
ljt3969636 2011-05-17
  • 打赏
  • 举报
回复
地址还是一样的?那你应该是在不同进程间这样做喽?不同进程对应各自独立的虚拟地址,相同的地址的数据是完全不一样的~~~如果说是这样的话你需要去了解下进程通信的方法。
degel 2011-05-17
  • 打赏
  • 举报
回复
值传递,引用传递,指针传递都试过了,结果是一样的.
[Quote=引用 6 楼 yangsen600 的回复:]
list<struct OBJECT>& rlist 不妨试一下
[/Quote]
degel 2011-05-17
  • 打赏
  • 举报
回复
谢谢,你不回帖我都无法回复了````
是有怀疑过模块问题,不过这些dll模块已经在一个简化的工程下成功了,所以就没有再怀疑本身的问题.
[Quote=引用 14 楼 xujiezhige 的回复:]
这样就复杂了,那个模块肯定出问题了!

在你调用的时候,list肯定已经改变了某些状态!

必须一点一点寻找错误了!
[/Quote]
雪人2015 2011-05-17
  • 打赏
  • 举报
回复
这样就复杂了,那个模块肯定出问题了!

在你调用的时候,list肯定已经改变了某些状态!

必须一点一点寻找错误了!
degel 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 q191201771 的回复:]
看下实参 与 形参的 地址 是否相同
[/Quote]
相同的
degel 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dizuo 的回复:]
你多线程调用callback?
[/Quote]
是的
degel 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]
是不是跨模块使用?
[/Quote]

是跨模块调用的,我简化了问题
小小蔷薇 2011-05-17
  • 打赏
  • 举报
回复
或者,函数改为这样,可以不?
void Fun(int i1,int i2,int i3,int i4, std::list<OBJECT> rlist )
{

……
}

小小蔷薇 2011-05-17
  • 打赏
  • 举报
回复
void CallFunc(int i1,int i2,int i3,int i4, std::list<OBJECT>& rlist )
{
//调用Fun
//这里rlist 正常?下面做参数进入Fun后就不对了?
Fun( i1, i2, i3, i4, &rlist );

}
这样可以不?
qq120848369 2011-05-17
  • 打赏
  • 举报
回复
很明显问题不单纯.
ljt3969636 2011-05-17
  • 打赏
  • 举报
回复
void CallFunc(int i1,int i2,int i3,int i4, std::list<OBJECT>& rlist )
{
//调用Fun
//这里rlist 正常?下面做参数进入Fun后就不对了?
Fun( i1, i2, i3, i4, rlist );

}
千杯不醉-sen 2011-05-17
  • 打赏
  • 举报
回复
list<struct OBJECT>& rlist 不妨试一下
就想叫yoko 2011-05-17
  • 打赏
  • 举报
回复
看下实参 与 形参的 地址 是否相同
千杯不醉-sen 2011-05-17
  • 打赏
  • 举报
回复

typedef struct object
{
int m1;
int m2;
}OBJECT;

struct OBJECT

没试过,c和c++连用是不是要严谨一点呢?
加载更多回复(5)

64,631

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧