zoukankan      html  css  js  c++  java
  • 也谈在动态连接库中如何使用STL库

    (本文首发于CSDN,现转贴入博客园,稍有修改)
    在动态连接库开发中要特别注意内存的分配与释放问题,稍不注意,极可能造成内存泄漏,从而访问出错。例如在某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库,就不会发生内存访问问题。

    前两天看到蒋晟.Net 文章Visual C++ 2005的版本区别,其中谈到Visual C++ 2005不再支持单线程的CRT(LIBC.lib),看来以后这一问题要永远走进坟墓了!

  • 相关阅读:
    Xpath提取一个标签里的所有文本
    Mac Sublime Text 3
    激活pycharm
    Mac 终端命令大全
    操作dict时避免出现KeyError的几种方法
    JQ 选择器大全
    调用百度编辑器
    模拟 Ajax 上传
    图片上传
    PHP 字符串去掉空格
  • 原文地址:https://www.cnblogs.com/gisattic/p/146805.html
Copyright © 2011-2022 走看看