不要在dll或lib的导出函数以string(cstring)作返回值
来源:互联网 发布:win10优化驱动器第8遍 编辑:程序博客网 时间:2024/05/22 05:20
不要在dll或lib的导出函数以string(cstring)作返回值
这是因为string和csting采用了Copy-On-Write技术,Copy-On-Write使用了“引用计数”,这是一种内存共享机制。
假设有一个动态链接库(叫myNet.dll或myNet.so)中有这样一个函数返回的是string类:
string GetIPAddress(string hostname)
{
static string ip;
……
……
return ip;
}
而你的主程序中动态地载入这个动态链接库,并调用其中的这个函数:
main()
{
//载入动态链接库中的函数
hDll = LoadLibraray(…..);
pFun =
//
string ip = (*pFun)(“host1”);
……
……
//释放动态链接库
FreeLibrary(hDll);
……
cout << ip << endl;
}
根 据函数的定义,我们知道函数是“值返回”的,所以,函数返回时,一定会调用拷贝构造函数,又根据string类的内存共享机制,在主程序中变量ip是和函 数内部的那个静态string变量共享内存(这块内存区是在动态链接库的地址空间的)。而我们假设在整个主程序中都没有对ip的值进行修改过。那么在当主 程序释放了动态链接库后,那个共享的内存区也随之释放。所以,以后对ip的访问,必然做造成内存地址访问非法,造成程序crash。即使你在以后没有使用 到ip这个变量,那么在主程序退出时也会发生内存访问异常,因为程序退出时,ip会析构,在析构时就会发生内存访问异常。
- 不要在dll或lib的导出函数以string(cstring)作返回值
- 不要在dll或lib的导出函数以string(cstring)作返回值
- dll lib 导出函数
- DLL中函数返回CString的问题
- 从 DLL(动态库)或Lib(静态库)中导出模板函数
- 导出DLL的LIB
- 如何生成DLL文件并导出函数及如何在C++或C#中调用DLL中导出的函数
- C++中以bool作返回值的函数的常见错误
- 查看lib文件中导出函数或变量的方法
- 临时变量作函数的返回值
- cUrl库 lib 不要dll 的设置
- crt new实现方法,Dll导出函数返回string和动态内存陷阱
- 引用作函数返回值
- dll文件导出对应的lib文件
- dll导出中函数中使用CString类型的参数引发的ESP出错
- dll导出中函数中使用CString类型的参数引发的ESP出错
- 查看lib的导出函数
- 创建一个返回String或&str的Rust函数
- XMLSchema.xsd 文件约束xml文档格式内容
- Android 4.0 Phone拨号和来电流程分析
- Android4.0 开放Root权限
- [技术分享]20120827 TMG 相关服务启动不了怎么办
- zf权限问题(第一种)
- 不要在dll或lib的导出函数以string(cstring)作返回值
- hdu 1263 水果 map的双重用法 超级帅呆 重要哦
- Skywiper – Fanning the ‘Flames’ of Cyberwarfare
- Objective-C学习笔记(3)----浅谈 Objective-C 下对象的初始化
- openstack installation methods
- spring直接获取bean定义
- android通过资源名称去获得资源ID
- jsoup开发指南
- python urllib/urllib2应用