关于DLL中导出类、导出函数接口的参数
2012-09-11 15:43
204 查看
内存的申请与释放是编写DLL时经常带来麻烦的问题,下面举两个最近遇到的例子。
1. vector&,与其它类似的参数错误的做法:以vector&形式传递参数,用来接收数据,在DLL内对vector进行填充。这样做会导致vector在DLL外析构时发生内存指针失效异常。这类问题只发生在程序静态编译的情况下。错误原因:vector在DLL通过pushback函数开辟了堆空间,析构时在DLL外进行内存释放。《Windows
核心编程》第5版19章 DLL编程有详细讲解。 正确的做法:以vector*形式传递参数,传递NULL指针到DLL,由DLL通过new开辟空间,能及填充内容。DLL提供释放接口函数类似 void destroy(vector* pVector); DLL的调用者在对数据使用完毕后,调用些函数进行内存释放。
2. string,与其它在拷贝构造时会开辟空间的数据类型 错误的做法:通过传递形参提供数据给DLL BOOL IsPathExist(string strPath)。这样做会导致strPath在DLL函数IsPathExit退出时,调用string类的析构后发生内存指针失效异常。这类问题也只发生在程序静态编译的情况下。错误原因:strPath在函数被调用时,通过拷贝构造被创建,但此过程是发生在DLL外的!正确的做法:传递string&
strPath,避免拷贝构造。
1. vector&,与其它类似的参数错误的做法:以vector&形式传递参数,用来接收数据,在DLL内对vector进行填充。这样做会导致vector在DLL外析构时发生内存指针失效异常。这类问题只发生在程序静态编译的情况下。错误原因:vector在DLL通过pushback函数开辟了堆空间,析构时在DLL外进行内存释放。《Windows
核心编程》第5版19章 DLL编程有详细讲解。 正确的做法:以vector*形式传递参数,传递NULL指针到DLL,由DLL通过new开辟空间,能及填充内容。DLL提供释放接口函数类似 void destroy(vector* pVector); DLL的调用者在对数据使用完毕后,调用些函数进行内存释放。
2. string,与其它在拷贝构造时会开辟空间的数据类型 错误的做法:通过传递形参提供数据给DLL BOOL IsPathExist(string strPath)。这样做会导致strPath在DLL函数IsPathExit退出时,调用string类的析构后发生内存指针失效异常。这类问题也只发生在程序静态编译的情况下。错误原因:strPath在函数被调用时,通过拷贝构造被创建,但此过程是发生在DLL外的!正确的做法:传递string&
strPath,避免拷贝构造。
相关文章推荐
- C#调用VC DLL接口函数参数类型转换的方法
- C#调用VC的DLL的接口函数参数类型转换一览表
- C#调用VC的DLL的接口函数参数类型转换一览表
- C#调用VC的DLL的接口函数参数类型转换一览表
- 关于未知dll函数参数的获取问题!
- 函数作为参数调用(关于函数接口插件的想法)
- C#调用VC DLL接口函数参数类型对应介绍
- C#调用VC的DLL的接口函数参数类型转换一览表
- C#调用VC DLL接口函数参数类型转换方法介绍
- C#调用VC的DLL的接口函数参数类型转换一览表
- 关于DLL模块导出函数
- C#调用VC的DLL的接口函数参数类型转换一览表
- C#调用VC的DLL的接口函数参数类型转换一览表
- 查看DLL中导出的函数及参数
- 关于DLL导出函数的总结
- python 调用dll中参数为BYTE的函数(注意接口定义的格式)
- 导出 delphi 的dll 函数名,没有参数,先记下,下次再来研究.
- C#调用VC的DLL的接口函数参数类型转换
- C++28、 创建dll,导出单个函数以及导出类
- dll导出中函数中使用CString类型的参数引发的ESP出错