内存的申请与释放是编写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,避免拷贝构造。

本文讨论了在DLL开发中常见的内存管理问题,特别是针对vector和string等数据类型的不当使用导致的内存异常情况,并提供了有效的解决方案。
1230

被折叠的 条评论
为什么被折叠?



