社区
C++ 语言
帖子详情
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
打赏
收藏
std::string 分配内存出错
自己的一个小程序,使用std::string ,创建一个对象时,直接赋值一个字符串常量,运行时经常发送内存错误。出错后,查看调用堆栈,居然是这个赋值语句造成的。真是郁闷。还有同仁遇到这种问题吗? 代码: #ifdef _UNICODE #define tstring wstring #else #define tstring string #endif tstring strOut = _T("正在下载更新文件"); //注:编译时没有使用_UNICODE
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
C++系列第2:C++2.0(11+14+17+20)详解及多线程实战
90 5.5.1 RAII 与引用计数 90 5.5.2
std
::shared_ptr 90 5.5.3
std
::unique_ptr 91 5.5.4
std
::weak_ptr 91 第6章 C++2.0多线程原理与实战 93 什么是并发 93 并发的方式 93 为什么使用并发 95 线程简介 96 创建线程...
std
::
string
底层原理分析
可以从一个简单的问题来弹错,一个
std
::
string
对象占据的内存空间有多大?即sizeof(
std
::
string
)的值为多大?如果我们在不同的编译器(VC++、GNU、Clang++)上去测试,可能会发现其值是不同的;即使是GNU,不同的...
C/C++笔记:
std
::
string
(一)
memcpy参考【C/C++笔记:动态内存分配】 char strA[0x10] = "123"; char strB[0x10] = "456"; char strC[0x20]; memcpy(strC, strA, strlen(strA)); memcpy(strC + strlen(strA), strB, strlen(strB) + 1); ...
为什么C++17要引入
std
::
string
_view?
std
::
string
_view的优点:1)高效性:
std
:
string
_view主要用于提供字符串的视图(view),使
std
::
string
_view拷贝字符串的过程非常高效,永远不会创建字符串的任何副本,不像
std
::
string
会效率低下且导致内存开销。
std
...
给结构体中
std
::
string
成员变量赋值失败
给结构体中
std
::
string
成员变量赋值失败的行为:在c++中结构体中包含
std
::
string
时,要用new去
分配内存
,不用malloc在用new一个对象时,不能用memset去赋0操作,否则不能赋值...
C++ 语言
64,691
社区成员
250,497
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章