调用其他DLL时传递vector和string的问题

zxt6405 2011-09-26 01:26:17
我的程序主模块在调用其他DLL的函数的时候,以引用的方式传递了参数,参数的类型vector<string>。
在DLL中程序对这个vector<string>类型的参数进行了处理。
然后在主模块中析构这个经过处理的vector<string>类型的变量的时候,主程序报堆损坏的错误。
我看到有些说法是跨模块传递的时候尽量不要用C++的类,尽量用C的风格,是这样么?
...全文
1484 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxt6405 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 caddor2011 的回复:]
你的意思是: 因为你手动释放了vector导致的?

还是你没有多次释放,就会崩溃?


这么一说,我心虚了 ,我以前写过的dll,就用了vector, 怎么没有发现这个问题






引用 6 楼 zxt6405 的回复:

引用 4 楼 caddor2011 的回复:
vector没有深究, 但是它有自动释放的功能吧

你再再主模块释放,,你说后果会怎样?
……
[/Quote]

我这个vector是自动释放的。
我的这个vector不是new出来在堆上申请内存的那种,而是在栈上申请内存的。在离开这个函数的时候会自动释放这个vector。
我出现问题是在模块间调用函数时,参数用了Vector所致,也许你只是在dll内部使用了vector……
zxt6405 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ugly927846 的回复:]
传递标准的类型,呵呵IDE还没有这么智能知道你要用于dll。
[/Quote]
这个……
这个应该是编译器的问题吧……
好想和IDE关系不是很大啊……
oyljerry 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zxt6405 的回复:]
哦,谢谢。
另外关于这个问题,有没有一些比较详细的资料或者书籍提到过这个问题。或者说应该用什么关键字去在MSDN等地方查找这种问题的答案。
我想知道更详细一些的原理。

另外,感觉这种问题有点像是VC的bug,没有对C++的STL的一些功能提供很好的支持,可以这么认为么?
[/Quote]

http://stackoverflow.com/questions/1763739/problem-retuning-a-vector-from-a-c-dll-to-another-c-exe
jamseyang 2011-09-27
  • 打赏
  • 举报
回复
DLL不是C++专用的,你在输出函数中使用Vector、引用,那么C、VB、Delphi怎么调用呢?
所以还是使用标准数据类型吧!
caddor2011 2011-09-27
  • 打赏
  • 举报
回复
vector没有深究, 但是它有自动释放的功能吧

你再再主模块释放,,你说后果会怎样?


[Quote=引用楼主 zxt6405 的回复:]
我的程序主模块在调用其他DLL的函数的时候,以引用的方式传递了参数,参数的类型vector<string>。
在DLL中程序对这个vector<string>类型的参数进行了处理。
然后在主模块中析构这个经过处理的vector<string>类型的变量的时候,主程序报堆损坏的错误。
我看到有些说法是跨模块传递的时候尽量不要用C++的类,尽量用C的风格,是这样么?
[/Quote]
caddor2011 2011-09-27
  • 打赏
  • 举报
回复
你的意思是: 因为你手动释放了vector导致的?

还是你没有多次释放,就会崩溃?


这么一说,我心虚了 ,我以前写过的dll,就用了vector, 怎么没有发现这个问题





[Quote=引用 6 楼 zxt6405 的回复:]

引用 4 楼 caddor2011 的回复:
vector没有深究, 但是它有自动释放的功能吧

你再再主模块释放,,你说后果会怎样?



引用楼主 zxt6405 的回复:
我的程序主模块在调用其他DLL的函数的时候,以引用的方式传递了参数,参数的类型vector<string>。
在DLL中程序对这个vector<string>类型的参数进行了处理。
然后在主模块中析构……
[/Quote]
欣客 2011-09-27
  • 打赏
  • 举报
回复
传递标准的类型,呵呵IDE还没有这么智能知道你要用于dll。
zxt6405 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jamseyang 的回复:]
DLL不是C++专用的,你在输出函数中使用Vector、引用,那么C、VB、Delphi怎么调用呢?
所以还是使用标准数据类型吧!
[/Quote]
说的有理。
但是我觉得应该有相关提示警告一下我们这些编码人员,使用标准数据类型。
我没找到这些警告……
zxt6405 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 caddor2011 的回复:]
vector没有深究, 但是它有自动释放的功能吧

你再再主模块释放,,你说后果会怎样?



引用楼主 zxt6405 的回复:
我的程序主模块在调用其他DLL的函数的时候,以引用的方式传递了参数,参数的类型vector<string>。
在DLL中程序对这个vector<string>类型的参数进行了处理。
然后在主模块中析构这个经过处理的vector<string>类型的变……
[/Quote]

程序会崩溃,而且崩溃的地方就是在它自动释放的时候。
崩溃的直接原因是堆损坏,就是释放的时候出了问题。
不仅仅是vector,list我也试过,结果一样。
zxt6405 2011-09-26
  • 打赏
  • 举报
回复
哦,谢谢。
另外关于这个问题,有没有一些比较详细的资料或者书籍提到过这个问题。或者说应该用什么关键字去在MSDN等地方查找这种问题的答案。
我想知道更详细一些的原理。

另外,感觉这种问题有点像是VC的bug,没有对C++的STL的一些功能提供很好的支持,可以这么认为么?
morebread 2011-09-26
  • 打赏
  • 举报
回复
是的。我现在写的一个dll模块在最初的时候传递的参数也是一个vector的引用。后来在使用的过程中释放这个vector的资源出错。

现在改为传递一个vector的空指针,dll内部分配和释放空间,就没问题了
oyljerry 2011-09-26
  • 打赏
  • 举报
回复
嗯,一般跨模块尤其作为参数,最好用一些标准数据类型,你的vector,string等都会有自动内存分配释放等处理,跨模块容易有一些问题.

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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