打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【转】不要在dll或lib的导出函数以string(cstring)作返回值

 这是因为string和csting采用了Copy-On-Write技术,Copy-On-Write使用了引用计数”,这是一种内存共享机制。

假设有一个动态链接库(叫myNet.dllmyNet.so)中有这样一个函数返回的是string类:


string GetIPAddress(string hostname)
{
static string ip;
……
……
return ip;
}


而你的主程序中动态地载入这个动态链接库,并调用其中的这个函数:


main()
{
//
载入动态链接库中的函数
hDll = LoadLibraray(…..);
pFun =  GetModule(hDll,“GetIPAddress”);

//
调用动态链接库中的函数
string ip = (*pFun)(“host1”);
……
……
//
释放动态链接库
FreeLibrary(hDll);
……
cout << ip<< endl;
}


    根 据函数的定义,我们知道函数是值返回的,所以,函数返回时,一定会调用拷贝构造函数,又根据string类的内存共享机制,在主程序中变量ip是和函数内部的那个静态string变量共享内存(这块内存区是在动态链接库的地址空间的)。而我们假设在整个主程序中都没有对ip的值进行修改过。那么在当主程序释放了动态链接库后,那个共享的内存区也随之释放。所以,以后对ip的访问,必然做造成内存地址访问非法,造成程序crash。即使你在以后没有使用到ip这个变量,那么在主程序退出时也会发生内存访问异常,因为程序退出时,ip会析构,在析构时就会发生内存访问异常。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
标准C++类string的Copy
C#动态调用非托管DLL
Visual?Studio下建立并显示调用自己的动态链接库dll
VC++动态链接库(DLL)编程深入浅出(二)
[交流]关于对话框DoModal()函数调用失败的原因分析
nodejs如何调用动态链接库(dll)呢?写一个addon来处理,写此文抛砖引玉。
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服