STL C++ string类不能使用memcpy,memset等一序列内存操作

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;
}
};


  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值