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


0 0