跨dll使用template/STL需要注意的问题

作者: admin 分类: 开发问题 发布时间: 2013-08-22 08:50 ė3,130 浏览数 6没有评论
文章转自王牌软件
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)

dll:
extern “C”
{
__declspec(dllexport) void PrintVector(const vector<int> v)
{
copy(v.begin(), v.end(), ostream_iterator<int>(cout, ” “));
}
}
exe:
typedef void (* FUNC)(const vector<int>);
int main()
{
HMODULE hModule = LoadLibrary(“VectorDll.dll”);
if (hModule)
{
FUNC fun = (FUNC)GetProcAddress(hModule, “PrintVector”);
vector<int> v(10, 1);
fun(v);
}
return 0;
}
上面代码存在严重的问题,运行时会崩溃:

在windows核心编程中明确的说了在dll中如果申请了内存空间,就一定要在dll中释放这块内存空间。
在exe和dll都静态链接到C/C++运行时库的时候,exe和dll都有各自的堆(heap)空间,所以各自申请的内存需要各自释放。
上面代码将参数改成 const vector<int> & 就可以正常运行。
但是如果exe中的vector版本和dll中vector的版本不同,问题又会出现,并且这些是未知的问题。
所以在dll函数接口中尽量使用基本数据类型。
关于exe和dll内存分配:

http://www.codeguru.com/forum/showthread.php?t=229394

http://www.gamedev.net/community/forums/topic.asp?topic_id=289896

http://blog.csdn.net/dotphoenix/archive/2009/07/14/4348686.aspx

http://blog.sina.com.cn/s/blog_60d705b10100g4ou.html

http://hi.baidu.com/honey%BC%A6/blog/item/8780d1f918976ed5b58f310f.html

关于dll和template/STL:

http://www.hellocpp.net/Articles/Article/714.aspx



只回答业务咨询点击这里给我发消息 点击这里给我发消息

王牌软件,兼职软件设计,软件修改,毕业设计。

本文出自 王牌软件,转载时请注明出处及相应链接。

本文永久链接: http://www.softwareace.cn/?p=532

0

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">


Ɣ回顶部

无觅相关文章插件,快速提升流量