社区
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
...全文
381
8
打赏
收藏
std::string 分配内存出错
自己的一个小程序,使用std::string ,创建一个对象时,直接赋值一个字符串常量,运行时经常发送内存错误。出错后,查看调用堆栈,居然是这个赋值语句造成的。真是郁闷。还有同仁遇到这种问题吗? 代码: #ifdef _UNICODE #define tstring wstring #else #define tstring string #endif tstring strOut = _T("正在下载更新文件"); //注:编译时没有使用_UNICODE
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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++性能优化技术
C++性能优化技术,详细介绍了可以普遍提升的一些C++变成技巧,是您精通优化技术的良师益友。
std
::
string
底层原理分析
std
::
string
作为我们经常使用的一种STL容器,我们是否某个时刻有想过它的底层到底是如何实现的?其实在
std
::
string
的历史中,出现过几种不同的方式。可以从一个简单的问题来弹错,一个
std
::
string
对象占据的内存空间有多大?即sizeof(
std
::
string
)的值为多大?如果我们在不同的编译器(VC++、GNU、Clang++)上去测试,可能会发现其值是不同的;即使是GNU,不同的版本,获取的值也不同。
Windows内存体系(10) -- 使用
std
::
string
跨MT模块传参
前面的《Windows内存体系(9) – 跨MT模块的内存相互释放的问题》文章解释了跨MT模块分配的内存相互释放为什么会崩溃的问题。 一、问题描述 这篇文章主要介绍我们在实际开发中经常遇到的一个问题:针对MT模块定义接口函数时,接口参数使用
std
::
string
类型,在程序运行时遇到"Debug Assertioni Failed"错误的问题。 上面的错误提示是debug_heap....
C/C++笔记:
std
::
string
(一)
1. 需求:把两个字符串拼接一下. 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);
std
::cout << strC <<
std
::endl; ..
为什么C++17要引入
std
::
string
_view?
std
::
string
_view的优点:1)高效性:
std
:
string
_view主要用于提供字符串的视图(view),使
std
::
string
_view拷贝字符串的过程非常高效,永远不会创建字符串的任何副本,不像
std
::
string
会效率低下且导致内存开销。
std
::
string
_view不拥有字符串数据,它仅提供对现有字符串的视图或引用(view or reference)。这使得它适合需要访问或处理字符串而无需内存分配或重新分配开销的场景,特别是在处理大量字符串时非常有用。
C++ 语言
65,186
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章