STL C++ string类不能使用memcpy,memset等一序列内存操作
来源:互联网 发布:toblerone淘宝 编辑:程序博客网 时间:2024/06/08 08:42
STL C++ string类不能使用memcpy,memset等一序列内存操作函数!!!
对于memcpy函数 ,因为memcpy 执行的是浅拷贝,而String类因为用指针自行管理内存,是不能进行浅拷贝的。比如如下代码会发生访问异常:
std::wstring* pstrGameName = new std::wstring(L"大天使之剑");
std::wstring* pstrCopyGameName = new std::wstring();
memcpy(pstrCopyGameName, pstrGameName , sizeof(std::wstring));
delete pstrGameName;
pstrGameName = NULL;
delete pstrCopyGameName;
pstrCopyGameName = NULL;
因为这两个string都是在堆区分配的,第一个string(* pstrGameName)在new的时候,会申请一块WCHAR* 数组,第二string在进行memcpy拷贝的时候,由于是浅拷贝,只是把* pstrCopyGameName的WCHAR* 指针指向了第一个string的WCHAR*数组。即两个string内部的WCHAR指针指向了同一块内存区域。但分别delete掉两个string的时候 ,会对同一块WCHAR数据区域释放两次,所以会造成访问冲突,发生崩溃。
所以从这里要养成一个好的编程习惯,就是在定义struct结构体的时候,成员最好不要使用string类,而是用WCHAR数组来代替。同时不要使用memcpy函数,而是自己重装结构体的复制操作符,通过赋值操作符来对struct进行复制。
以下方式不推荐使用:
struct ClockInfo
{
std::wstring strGameName;
};
以下方式推荐使用:
struct ClockInfo
{
WCHAR szGameName[1024];
ClockInfo()
{
memset(szGameName, 0 , sizeof(szGameName));
}
ClockInfo& operator=(const ClockInfo& cInfo)
{
if(&cInfo != this)
{
memcpy(this->szGameName, cInfo.szGameName, sizeof(this->szGameName));
}
return *this;
}
};
- STL C++ string类不能使用memcpy,memset等一序列内存操作
- string 不能使用memset or memcpy
- C操作内存函数(memset,memcpy,memcmp)
- 操作内存利器memset,memmove,memcpy
- 内存操作函数memmove,memcpy,memset
- 使用memset、memcpy等函数需要包含string.h而不是strings.h
- C语言之内存操作:memset & memcpy
- 内存操作函数memcpy,memccpy,memmove,memchr,memcmp,memicmp,memset
- 内存操作函数memcpy,memccpy,memmove,memchr,memcmp,memicmp,memset
- C++容器中勿使用memset,memcpy等
- memset、memcpy使用陷阱
- memset memcpy使用
- 使用STL string慎用memcpy和void*
- c string 用法,memcpy,strcpy,strcmp 等
- memset on stl string
- c函数之memcpy ,memset,malloc函数使用
- C和指针之字符串memcpy、memmove、memset使用总结
- strcpy ;memcpy;memset 操作说明
- leetcode.227. Basic Calculator II
- 基于openfire的webIM的实现机制想法
- Android------startActivityForResult的详细用法
- 第十一周实践项目(3)
- poj1182食物链(带权并查集+路径压缩)
- STL C++ string类不能使用memcpy,memset等一序列内存操作
- Android屏幕保护KeyguardManager相关内容学习
- Spark-RDD API
- Java自带的MD5加密
- Entity Framework Extended Library (EF扩展类库,支持批量更新、删除、合并多个查询等)
- teechart怎么删除(到达一定数目)动态曲线出现过的点
- [MZ test.16]P1 评测
- CUDA之——入门程序
- 和接口有关的匿名类