不要在dll或lib的导出函数以string(cstring)作返回值

不要在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会析构,在析构时就会发生内存访问异常。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值