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