My E-mail 用志趣吸引人;用感情留住人;用技術武裝人;用創新發展人;一切以人為本!

Leo LU

vc win32 开发中的疑难问题及解答

错误1:解决error C2011: 'fd_set' : 'struct' type redefinition问题

在所有的#include <windows.h>前使用#define WIN32_LEAN_AND_MEAN,如:

#define WIN32_LEAN_AND_MEAN
#include 
<windows.h>

错误2:dll中使用STL,极可能造成内存泄漏,从而访问出错

在动态连接库开发中要特别注意内存的分配与释放问题,稍不注意,极可能造成内存泄漏,从而访问出错。例如在某DLL中存在这样一段代码:

  extent "C" __declspec(dllexport)
  void ExtractFileName( const std::string& path //!< Input path and filename.
  , std::string& fname   //!< Extracted filename with extension.
  )
  {
  std::string::size_type startPos = path.find_last_of('\\');
  fname.assign(path.begin()+startPos+1, path.end() );
  }


在DLL中使用STL对象std::string,并且在其中改变std::string的内容,即发生了内存的重分配问题,若在EXE中调用该函数会出现内存访问问题。主要是:因为DLL和EXE的内存分配方式不同,DLL中的分配的内存不能在EXE中正确释放掉。
  
  解决这一问题的途径如下:
  一般情况下:构建DLL必须遵循谁分配就由谁释放的原则,例如COM的解决方案(利用引用计数),对象的创建(QueryInterface)与释放均在COM组件内部完成。在纯C++环境下,可以很容易的实现类似方案。
  
  在应用STL的情况下,很难使用上述方案来解决,因此必须另辟蹊径,途径有二:
  
  1、自己写内存分配器替代STL中的默认分配器。
  2、使用STLport替代系统的标准库。
  
  其实,上述问题在VC7及以后版本中,已得到解决,注意DLL工程和调用的工程一定要使用多线程DLL库,就不会发生内存访问问题。

posted on 2007-05-31 15:07  Leo LU  阅读(347)  评论(0)    收藏  举报

导航