怎么把vc6中STL的string使用的引用计数策略关闭?

roger_77 2006-09-05 01:46:24
在MS的VC++6.0中,其STL实现的string使用了引用计数策略,
如何把string这种引用计数策略关闭,使其赋值时按正常的值copy方式进行。

不要跟偶说修改偶的源代码,偶记得有人说过,可以使用VC6某个编译条件把其关闭的?
偶忘了,请大侠帮帮忙吧
...全文
491 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
roger_77 2006-09-07
  • 打赏
  • 举报
回复
嘿嘿,
楼上说的有理!
yifanernei 2006-09-07
  • 打赏
  • 举报
回复
向 非彼邦德 致敬,BS那些自己找到问题不知道分享的家伙!~~!~!~!~!~!
roger_77 2006-09-07
  • 打赏
  • 举报
回复
呵呵,偶自己终于找到了其解决方案,这是MS提供的技术文章:
《STL std::string 类导致崩溃和内存损坏多处理器计算机上》
http://support.microsoft.com/default.aspx?scid=kb%3Bzh-cn%3B813810

部分内容:
----
替代方法
解决 Microsoft Visual C++ 6.0 STL 中 Std::String 类问题
如果执行不升级到新版的 STL, 您可以尝试纠正 std::string 类线程安全问题标准 Microsoft VisualC++6.0 安装中。 虽然有是与几个 Microsoft Visual C++ 6.0 STL, 中类 multi-threading 问题为止最常见和问题均为 std::string 类。 以下步骤和变通办法是 stopgap 措施以确保应用程序是否正常, 并提供时间来研究其他备选方案。 考虑将这些指令创建新代码路径和也许整个整个应用程序行为。 彻底测试应用重建程序依照公司或个人软件策略之前广泛部署软件策略之前广泛部署。
禁用字符串引用计数
每个变通本节中介绍要求您先禁用引用计数机制。 要禁用引用计数, 您必须修改 < xstring > 头文件, _FROZEN 枚举常量设置为 0 。 此外默认安装, < xstring > 头文件位于以下位置:
C:\ProgramFiles\Microsoft files\Microsoft Visual Studio\VC98\Include
将 _FROZEN 枚举常数更改为 0 在行 62 页 < xstring > 头文件中以便它与以下类似: enum _Mref {_FROZEN = 0}; // set to zero to disable sharing; original value 255
如果您按照此建议, 并重建所有软件使用这些头文件 std::string 类代码将是多线程。 有一些警告到该语句。 因此, 仔细阅读以下变通办法说明。 禁用引用计数通过在 < xstring > 头文件, _FROZEN 枚举常量设置为 0 后使用下列方法之一来解决此问题。

……

roger_77 2006-09-07
  • 打赏
  • 举报
回复
偶终于在论坛上找到有人说到的一种修改方法:
----------------------------
主  题: string=""为什么都发生了错?
作  者: Soft_micro () Blog
等  级:
信 誉 值: 100
所属社区: C/C++ C++ 语言
问题点数: 50
回复次数: 31
发表时间: 2006-6-20 9:02:19

----
mahatma_cn(研究硕士生) ( ) 信誉:99 Blog 2006-6-21 21:34:12 得分: 0



多线程读同一个string对象是安全的.
多线程同时写不同的string对象是安全的.
在多线程中最好修改std的<xstring>头文件,禁用引用计数功能

从你报告的错误来看.有如下可能:
1, 访问越界,导致破坏string内部数据边界,在bug模式下free会检查分配的内存边界是否被修改过,如果修改过则可能报错

----------------------------

偶不知道具体怎么修改MS的这个"xstring"文件?
有哪位知道的出来支一声,最好上面那个发言者来说一下!
sinall 2006-09-05
  • 打赏
  • 举报
回复
mark.
healer_kx 2006-09-05
  • 打赏
  • 举报
回复
是不是不同的编译选项,决定了不同xstring文件编译啊?
roger_77 2006-09-05
  • 打赏
  • 举报
回复
真的吗?
嘿,真的是这样滴?
healer_kx 2006-09-05
  • 打赏
  • 举报
回复
啊? 怎么玩?
jixingzhong 2006-09-05
  • 打赏
  • 举报
回复
把环境的内存优化开关关闭就是了 ...
sinall 2006-09-05
  • 打赏
  • 举报
回复
要不用vector<char>?
roger_77 2006-09-05
  • 打赏
  • 举报
回复
是的,曾经有人说过这种方法,好像是要修改VC6的STL源文件的编译条件。
可惜偶没记住。

因为偶的程序是在跨DLL传递string参数时出现两次释放同一个内存导致程序崩溃。

别人也谈到了解决方法:
-----------------------------------
也谈在动态连接库中如何使用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库,就不会发生内存访问问题。

=================================================
这种方法偶不怎么想用呀!
healer_kx 2006-09-05
  • 打赏
  • 举报
回复
真的假的啊? 不可能吧?
好像VC7就不是引用技术的了。大牛告诉我的。。。
代号为X3的C++轻量级通用插件框架平台是一套通用的C++轻量级插件体系,由多个独立插件模块组成。应用程序可以基于X3插件框架进行快速开发,X3插件框架的插件既可以单独使用,又可以灵活组合使用。X3插件框架采用VC++开发,没有使用MFC、ATL、COM,已经过3年十几个系统的实际使用验证。 目前X3插件框架包括插件内核部分(插件基础、插件管理器、Observer管理器插件、日志管理器插件)和实用技术插件(XML读写封装插件、数据库操作封装插件、文件操作实用插件、文本操作实用插件、本地化字符串表插件等)。 X3插件框架的特点有: a) 接口定义简单灵活 采用普通的C++接口,即由纯虚函数组成的结构体,不需要特殊的基类,不需要宏和UUID申明;同时可以使用C++的各种变量类型,不受COM接口那样的约束。例如下面的接口Ix_定义: interface Ix_Example { virtual void Foo() = 0; virtual void* GetData(std::vector& items) = 0; }; b) 接口与实现分离 对外提供接口文件,在插件内部用类来实现一个或多个接口,不需要对外导出该类或暴露实现细节。这样还有一个好处是只有约定了接口就可以让多个模块并行开发,模块相互之间不存在编译依赖(不需要其他插件的LIB等文件),这可用于测试驱动开发模式。 c) 多接口转换、引用计数管理 采用智能指针类来管理接口的引用计数及生命期,可从一个接口动态转换为另一个接口(内部采用C++的RTTI机制动态转换),可以区分插件内部的接口引用和插件外部的接口引用。 d) 模块透明部署 一个模块只需要使用其他模块的接口,不需要关心该接口是在哪个插件实现的。可以根据需要将各个实现类进行合并或拆分,使其分布到不同插件,而接口使用者不受影响。另外,插件部署于哪个目录也不影响插件接口的使用。 e) 模块可替换、可扩展 可根据需要替换某个插件,只有该插件实现了相同的接口,即使内部功能不相同,这样就实现了插件可替换、按需组合。通过在新的插件支持更多的接口,可扩展更多的功能。可以在新插件局部替换原有插件的某些接口或部分函数,实现重用和扩展。 f) 线程安全性 本插件机制所提供的内部实现文件考虑了线程安全性,允许多线程访问而不冲突,同时采用的是轻量级的锁定机制(计数原子锁定),运行开销很小。 g) 跨版本 允许不同版本的VC++开发的插件相互调用对方的接口,虽然实际一般不需要这样做。由于没有采用VC++特殊的编译指令,因此容易移植到其他开发平台下。 编译运行环境 本插件机制采用C++实现,用到了C++的RTTI机制和少量Windows API函数,没有使用MFC、ATL、STL,没有使用LIB文件,外部依赖文件少,没有使用VC++特殊编译指令。 编译环境为Visual C++ 6.0/2003/2005/2008/2010,其他C++开发平台下待测试(从实现原理上看应该没问题)。 运行环境为Windows 2000及以后的操作系统,Windows 98需要安装UNICODE支持包。 X3插件框架目前在局部范围内开放源码,还未在公共开源网站范围正式开放。可以学习研究、任意修改改进,但不可以换成其他作者另外发布,转载时请列出来源。 有改进意见可在博客地址或者邮件提出。 博客:http://www.cnblogs.com/rhcad 邮件:rhcad@hotmail.com 详细描述见 http://www.cnblogs.com/rhcad/archive/2010/09/27/1836943.html 附件内容: .\Product_vc100.sln .\Product_vc60.dsw .\Product_vc80.sln .\Product_vc90.sln .\Code ------\pkg_Core ------\pkg_Example ------\pkg_UnitTest ------\pkg_Core\Interface ------\pkg_Core\Modules ------\pkg_Core\Interface\AppUI ------\pkg_Core\Interface\ChangeObserver ------\pkg_Core\Interface\Ix_Object.h ------\pkg_Core\Interface\Ix_ObjectFactory.h ------\pkg_Core\Interface\Log ------\pkg_Core\Interface\Module ------\pkg_Core\Interface\PluginManager ------\pkg_Core\Interface\UtilFunc ------\pkg_Core\Interface\Utility ------\pkg_Core\Interface\XComPtr.h ------\pkg_Core\Interface\Xml ------\pkg_Core\Interface\AppUI\CmdMsgObserverSimple.h ------\pkg_Core\Interface\AppUI\Cx_CreateWnd.h ------\pkg_Core\Interface\AppUI\Ix_CreateWnd.h ------\pkg_Core\Interface\AppUI\RawCmdMsgObserver.h ------\pkg_Core\Interface\ChangeObserver\ChangeNotifyData.h ------\pkg_Core\Interface\ChangeObserver\Ix_ChangeManager.h ------\pkg_Core\Interface\ChangeObserver\Ix_ChangeObserver.h ------\pkg_Core\Interface\Log\DebugR.cpp ------\pkg_Core\Interface\Log\DebugR.h ------\pkg_Core\Interface\Log\ILogObserver.h ------\pkg_Core\Interface\Log\Ix_LogManager.h ------\pkg_Core\Interface\Log\LogHelper.h ------\pkg_Core\Interface\Module\Cx_Module.h ------\pkg_Core\Interface\Module\Cx_Object.h ------\pkg_Core\Interface\Module\Cx_SimpleObject.h ------\pkg_Core\Interface\Module\Cx_SingletonObject.h ------\pkg_Core\Interface\Module\Ix_Module.h ------\pkg_Core\Interface\Module\XClassItem.h ------\pkg_Core\Interface\Module\XModuleImpl.h ------\pkg_Core\Interface\Module\XModuleItem.h ------\pkg_Core\Interface\Module\XModuleMacro.h ------\pkg_Core\Interface\PluginManager\Ix_PluginLoader.h ------\pkg_Core\Interface\PluginManager\PluginManager.h ------\pkg_Core\Interface\PluginManager\XComCreator.h ------\pkg_Core\Interface\UtilFunc\AutoNew.h ------\pkg_Core\Interface\UtilFunc\ConvStr.h ------\pkg_Core\Interface\UtilFunc\ctrim.h ------\pkg_Core\Interface\UtilFunc\func_s.h ------\pkg_Core\Interface\UtilFunc\LockCount.h ------\pkg_Core\Interface\UtilFunc\LockSyn.h ------\pkg_Core\Interface\UtilFunc\ReadInts.h ------\pkg_Core\Interface\UtilFunc\RelToAbs.h ------\pkg_Core\Interface\UtilFunc\RoundStr.h ------\pkg_Core\Interface\UtilFunc\SafeCall.h ------\pkg_Core\Interface\UtilFunc\ScanFiles.h ------\pkg_Core\Interface\UtilFunc\SysErrStr.h ------\pkg_Core\Interface\UtilFunc\vecfunc.h ------\pkg_Core\Interface\UtilFunc\vecptr.h ------\pkg_Core\Interface\Utility\ClsID_TextUtil.h ------\pkg_Core\Interface\Utility\Ix_ClipboardUtil.h ------\pkg_Core\Interface\Utility\Ix_ConfigDBFactory.h ------\pkg_Core\Interface\Utility\Ix_FileTransaction.h ------\pkg_Core\Interface\Utility\Ix_FileUtility.h ------\pkg_Core\Interface\Utility\Ix_FileVersion.h ------\pkg_Core\Interface\Utility\Ix_GuidGenerator.h ------\pkg_Core\Interface\Utility\Ix_StringConvert.h ------\pkg_Core\Interface\Utility\Ix_TempFolder.h ------\pkg_Core\Interface\Utility\Ix_TextFileUtil.h ------\pkg_Core\Interface\Xml\ConfigIOSection.h ------\pkg_Core\Interface\Xml\IFileCryptHandler.h ------\pkg_Core\Interface\Xml\Ix_ConfigData.h ------\pkg_Core\Interface\Xml\Ix_ConfigSection.h ------\pkg_Core\Interface\Xml\Ix_ConfigSectionXml.h ------\pkg_Core\Interface\Xml\Ix_ConfigTransaction.h ------\pkg_Core\Interface\Xml\Ix_ConfigXml.h ------\pkg_Core\Interface\Xml\Ix_StringTable.h ------\pkg_Core\Interface\Xml\Ix_UIConfig.h ------\pkg_Core\Modules\ChangeManager\... ------\pkg_Core\Modules\LogManager\... ------\pkg_Core\Modules\PluginManager\... ------\pkg_Core\Modules\StringTable\... ------\pkg_Example\... ------\pkg_UnitTest\Interface\cppunit ------\pkg_UnitTest\Modules\TestCore ... .\Doc .\Doc\插件开发帮助.chm .\Doc\插件基础使用说明书.pdf

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧