跨dll使用template/STL需要注意的问题
站长推荐: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
学习日记,兼职软件设计,软件修改,毕业设计。
本文出自 学习日记,转载时请注明出处及相应链接。
本文永久链接: https://www.softwareace.cn/?p=532