首页新闻找找看学习计划

调用dll出现内存错误

0
悬赏园豆:100 [已解决问题] 解决于 2012-04-16 12:54

调用dll,出现了内存错误,向dll里传递了一个vector,dll向vector放了一点数据,程序退出的时候有内存错误。

mycan的主页 mycan | 初学一级 | 园豆:24
提问于:2012-04-14 20:47
< >
分享
最佳答案
0

出错就对了。。。

以前有人问过这个问题:

vector的本质就是一个变长数组,数据存储是在堆上的,在dll中存入数据,很可能就是在dll中申请的存储,在主程序里面释放的存储。如果你的程序采用静态链接的方式,每一个可执行模块都会创建自己的CRT堆,在模块内部进行new和delete操作的时候,是在CRT堆上进行的,这样不会出错,但是如果在dll模块中申请存储,但是在主程序模块释放存储,vector不知道如何正确释放dll中分配的内存或者释放存储的行为是错误的。

收获园豆:90
zsounder | 老鸟四级 |园豆:2819 | 2012-04-14 20:52

怎么修改才能正确?

mycan | 园豆:24 (初学一级) | 2012-04-15 22:57

@mycan: 修改链接方式为动态连接,也就是DLL CRT的方式,这种方式下CRT堆只会创建一份,也就是主可行性模块加载的时候创建的那一份,在同一个模块申请释放存储不会出错,或者采用静态链接的方式,不要在主程序和dll之间传递vector,或者先给vector预留足够的空间作为静态存储使用。

zsounder | 园豆:2819 (老鸟四级) | 2012-04-16 02:23
其他回答(1)
0

C#调用C++dll吗?

收获园豆:10
玉开 | 园豆:8822 (大侠五级) | 2012-04-14 20:48

vc调用c++的

支持(0) 反对(0) mycan | 园豆:24 (初学一级) | 2012-04-14 20:50

@mycan: 

我用C#调用c++出现过类似错误,原因是在c#中分配的非托管内存大小太小了。

支持(0) 反对(0) 玉开 | 园豆:8822 (大侠五级) | 2012-04-14 22:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册