std::string 分配内存出错

zhihuizhilv 2010-03-14 08:19:41
自己的一个小程序,使用std::string ,创建一个对象时,直接赋值一个字符串常量,运行时经常发送内存错误。出错后,查看调用堆栈,居然是这个赋值语句造成的。真是郁闷。还有同仁遇到这种问题吗?
代码:
#ifdef _UNICODE
#define tstring wstring
#else
#define tstring string
#endif

tstring strOut = _T("正在下载更新文件");

//注:编译时没有使用_UNICODE
...全文
333 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhihuizhilv 2010-03-14
  • 打赏
  • 举报
回复
问题解决了,是由于std::string 的共享内存机制在多线程下造成的。例如:
string str1 = "fdsfds";
string str2 = str1;

这个时候,虽然是两个对象,但是他们的实际数据内存是相同的。
在多线程的情况下,string考虑不周,没有做好多线程同步,会造成内存问题。

我的解决办法是,当一个对象可能被其他线程使用时,就避免它与别的对象共享内存:
str2 = str1.c_str();

经简单测试,问题貌似被解决了。

参考资料:
http://blog.csdn.net/wjun_8452/archive/2010/01/12/5182179.aspx
白云飘飘飘 2010-03-14
  • 打赏
  • 举报
回复
估计是前面的代码错误破坏了strOut变量
kingstarer 2010-03-14
  • 打赏
  • 举报
回复
一般是由于内存越界造成的

即在这行代码之前有其它代码操作内存时越界 当时没有立即出错 而导致后面代码出错了
耍宝王 2010-03-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhihuizhilv 的回复:]
不行吧。我的那段代码的意思是如果预定义了_UNICODE,就用wstring,否则用string.这个没有错的。
[/Quote]
是的,而我的那段代码的意思是,如果预定义了 _UNICODE 或者 UNICODE 宏,就用wstring,否则用string
#if defined(UNICODE) || defined(_UNICODE)
#define tstring wstring
#else
#define tstring string
#endif
zhihuizhilv 2010-03-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pgplay 的回复:]

你把#ifdef _UNICODE 改成 #if defined(UNICODE) || defined(_UNICODE) 试试
[/Quote]

不行吧。我的那段代码的意思是如果预定义了_UNICODE,就用wstring,否则用string.这个没有错的。
耍宝王 2010-03-14
  • 打赏
  • 举报
回复
你把#ifdef _UNICODE 改成 #if defined(UNICODE) || defined(_UNICODE) 试试
arong1234 2010-03-14
  • 打赏
  • 举报
回复
另外一种可能就是多线程情况没用并发控制
arong1234 2010-03-14
  • 打赏
  • 举报
回复
应该不是这里的代码引起的错误
看看

http://blog.vckbase.com/arong/archive/2009/12/30/40598.html

64,691

社区成员

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

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